如何禁用 Word 中的加载项?

如何禁用 Word 中的加载项?

Word 具有禁用加载项功能(帮助 | 关于 | 禁用项目)。

如何将插件添加到禁用列表中,而不必使插件崩溃并等待错误出现?

答案1

我一直在尝试自己找出 DisabledItems 键中值的二进制格式,您的帖子让我找到了正确的方向。不过,我认为格式与您看到的格式略有不同,至少在 Office 2010 中是这样。

据我所知,格式如下:

  • 前四个字节是 32 位整数。通常它的值似乎为 1。我不确定它有什么用途。

  • 接下来的四个字节是一个 32 位整数,它告诉我们 dll 路径的长度(以字节为单位),包括终止字符(空或 0x0000)。

  • 接下来的四个字节是一个 32 位整数,它告诉我们友好名称的长度(以字节为单位),包括终止字符(空或 0x0000)。

  • 下一个字节序列是一个以空字符结尾的大端 Unicode 字符串,其中包含插件 dll 的路径。出于某种原因,此路径似乎总是只包含小写字符。

  • 下一个字节序列是一个以空字符结尾的大端 Unicode 字符串,其中包含加载项的友好名称。

我已经能够使用以下 C# 代码成功硬禁用加载项:

string path = "<full path to add-in dll>".ToLower();
string friendlyName = "<add-in friendly name>";
        
MemoryStream stream = new MemoryStream();
BinaryWriter writer = new BinaryWriter(stream);
writer.Write(1); // type of disabled item : 1 => Add in / 2 => Document / 3 => Task pane
writer.Write((path.Length * 2) + 2); // Path length, 2 bytes per character
writer.Write((friendlyName.Length * 2) + 2); // Friendly name length
writer.Write(Encoding.Unicode.GetBytes(path)); // Path
writer.Write(Convert.ToInt16(0)); // null terminator
writer.Write(Encoding.Unicode.GetBytes(friendlyName)); // Friendly name
writer.Write(Convert.ToInt16(0)); // null terminator
writer.Close();

// Version numbers: 11.0 = Office 2003, 12.0 = Office 2007, 14.0 = Office 2010
RegistryKey key = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Office\14.0\Word\Resiliency\DisabledItems", true);
key.SetValue("63CB962", stream.ToArray(), RegistryValueKind.Binary);
key.Close();

可以使用类似的方法来解码现有值的 dll 路径,如下所示:

// Let 'bytes' be a byte array containing the binary registry value
BinaryReader binaryReader = new BinaryReader(new MemoryStream(bytes));
binaryReader.ReadInt32(); // Read the first four bytes and ignore
int pathLength = binaryReader.ReadInt32(); // The next four bytes are the length of the path
binaryReader.Close();
if (bytes.Length >= 12 + pathLength)
{
    string path = Encoding.Unicode.GetString(bytes, 12, pathLength - 2);
}

答案2

回答我自己的问题。

它位于注册表中,位于 HKCU\Software\Microsoft\Office[version]>\Word\Resiliency\DisabledItems 下(其中 [version] 对于 XP 为 10.0、对于 2003 为 11.0、对于 2007 为 12.0)。

这些密钥是二进制密钥,其名称由六个(据我所知是随机的)十六进制字符组成。

该值为:01,00,00,00,x,00,00,00,y,[path],00,00,[name],00,00,00 x 是路径中的字节数(包括两个终止符字节),y 是名称中的字节数(即“友好名称”)。x+y 应为总字节数减 10。x 和 y 均为十六进制。我假设它们实际上是 DWORD,但我只需要 LSB。

该路径采用 UCS-2 小端编码,例如“c:\”为 00,63,00,3a,00,5c

是的,二进制编码似乎是“取一个以空字符结尾的 ASCII 字符串,将其转换为 Unicode,然后取其字节并以空字符结尾的结果”的绝妙编码

请注意,x 和 y 是字节数,而不是字符数;UCS-2 中每个字符有 2 个字节。

如果您想要阻止模板(即 .dot 而不是 .dll),则将 00 放入 y 并跳过名称元素和终止(因此它以三个空字节结尾,而不是五个)。

答案3

请注意,Eirikur 的代码仅在 Resiliency\DisabledItems 子项到位时才有效。Word 似乎会在禁用/启用时添加/删除整个子项。因此,如果您在运行代码时遇到异常,则可能需要先添加子项。

(我在这里的帖子可能应该得到审核,它属于评论,但我没有足够的积分!糟糕的开始)

答案4

根据这个MS 站点要在 Word 2007 中禁用加载项,请执行以下操作:

  1. 单击“Microsoft Office 按钮”按钮图像,单击“Word 选项”,然后单击“加载项”。
  2. 在“加载项”框中,找到要启用或禁用的加载项,并记下“类型”列中的加载项类型。
  3. 在管理框中选择插件类型,然后单击前往。
  4. 选中或清除要启用或禁用的加载项的复选框,然后单击“确定”。

相关内容