You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Word VSTO插件中Word.Document的EncryptionProvider使用问题咨询

解决Word VSTO插件中EncryptionProvider属性的问题

1. 避开直接赋值的异常陷阱

直接给Word.Document.EncryptionProvider赋值触发OutOfMemoryException,本质是该属性仅允许在文档未加密、未绑定任何加密提供程序的状态下设置,且必须传入已注册的合法ProgID——随机字符串或未注册ID会导致底层内存操作异常。操作前需:

  • 先检查文档状态:若Document.EncryptionProvider不为空/默认值,先调用Document.Unprotect()解密
  • 使用合法ProgID:比如Office内置RMS加密的ProgID为"Microsoft.RMS.EncryptionProvider",自定义提供程序需先在注册表注册(32位Office路径:HKLM\Software\Microsoft\Office\16.0\Common\Crypto\Encryption Providers;64位对应HKLM\Software\Wow6432Node\...)

2. 让EncryptionProvider接口生效的正确姿势

接口方法未执行,是因为VSTO对接口实例的返回有严格要求:

  • 实现类必须标记[ComVisible(true)]且为公共类
  • 必须完整实现Office.EncryptionProvider的所有方法(包括GetProviderDetail、EncryptDocument等)
  • 在插件的RequestService方法中,精准匹配Office.EncryptionProvider.GUID并返回接口实例

示例代码:

[ComVisible(true)]
public class CustomEncryptionProvider : Office.EncryptionProvider
{
    public override void EncryptDocument(object Document, ref object EncryptionProperties)
    {
        // 编写你的文档加密逻辑
    }

    public override void DecryptDocument(object Document, ref object EncryptionProperties)
    {
        // 编写你的文档解密逻辑
    }

    public override void GetProviderDetail(Office.EncryptionProviderDetail detailType, ref object value)
    {
        if (detailType == Office.EncryptionProviderDetail.epdDisplayName)
        {
            value = "自定义加密提供程序";
        }
    }

    // 必须实现其余接口方法(如QueryCapability、ShowSettings等)
}

// 在VSTO插件类中重写RequestService
protected override object RequestService(Guid serviceGuid)
{
    if (serviceGuid == typeof(Office.EncryptionProvider).GUID)
    {
        return new CustomEncryptionProvider();
    }
    return base.RequestService(serviceGuid);
}

3. 绑定加密提供程序的完整流程

  1. 确保插件加载后,RequestService能正确返回EncryptionProvider实例
  2. 先配置加密选项(可选,但能降低异常概率):
document.SetPasswordEncryptionOptions(
    PasswordEncryptionProvider: "你的加密提供程序ProgID",
    PasswordEncryptionAlgorithm: "AES",
    PasswordEncryptionKeyLength: 256,
    PasswordEncryptionFileProperties: true
);
  1. 再设置EncryptionProvider属性:
document.EncryptionProvider = "你的加密提供程序ProgID";
  1. 最后调用Document.Protect或Document.Save触发加密逻辑

关键注意事项

  • 自定义加密提供程序必须在注册表完成注册,否则Office无法识别
  • 测试用空白文档,避免已有加密状态干扰
  • 区分32位/64位Office的注册表注册路径

内容的提问来源于stack exchange,提问作者EekTheCat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 15:31:11