gpt4 book ai didi

excel - 通过打开文件启动 Excel 时,不加载 Excel 的 COM 加载项

转载 作者:行者123 更新时间:2023-12-01 19:04:45 28 4
gpt4 key购买 nike

一些用户报告说,如果他们通过双击 Excel 文件来启动 Excel,则加载项将无法加载。但是,如果他们通过“开始”菜单(或快速启动工具栏)打开 Excel,则加载项可以正常加载。

一些细节,如果有帮助的话:

  • 它是一个 COM 加载项,用 VB6 编写。
  • 已在 Windows XP/Excel 2003 和 Vista/Excel 2007 系统上报告该问题。
  • 该加载项实现 IDTEXtensibility2。
  • 启动模式设置为“启动时加载”。

任何关于原因或如何解决此问题的想法将不胜感激。

更新:我相信我已经找到了解决这个问题的方法。

注册 IDTExtensibility2 dll 时,它会自动为加载行为、加载项名称等创建 HKCU 条目。但我还让我的安装文件将加载项注册到 HKLM,以便所有人都可以使用它机器上的用户。这导致系统上存在双重注册表项。

我认为这不是问题的原因。我手动编辑了 HKCU 条目,Excel 似乎忽略了它们并遵循 HKLM 条目。然而,我收到另一位开发人员的提示,解释说他们也遇到了同样的问题,他们的解决方案是删除重复的注册表项。我尝试了一下,似乎已经解决了(极少数)报告该错误的人的问题。

下面的 Inno Setup 代码将添加 HKLM 条目,仔细检查加载行为是否正确(因为我很偏执),然后删除 HKCU 条目。在您看到全部大写的地方替换您的文件属性。

[Registry]
Root: HKLM; Subkey: Software\Microsoft\Office\Excel\Addins\CONNECT_CLASS; Flags: uninsdeletekey
Root: HKLM; Subkey: Software\Microsoft\Office\Excel\Addins\CONNECT_CLASS; ValueType: string; ValueName: FriendlyName; ValueData: ADDIN_NAME
Root: HKLM; Subkey: Software\Microsoft\Office\Excel\Addins\CONNECT_CLASS; ValueType: string; ValueName: Description; ValueData: ADDIN_DESC
Root: HKLM; Subkey: Software\Microsoft\Office\Excel\Addins\CONNECT_CLASS; ValueType: dword; ValueName: LoadBehavior; ValueData: 3
Root: HKLM; Subkey: Software\Microsoft\Office\Excel\Addins\CONNECT_CLASS; ValueType: dword; ValueName: CommandLineSafe; ValueData: 0


// Set load behavior to on start up
procedure ResetAddinRegKeys();
var
bUpdate : Boolean;
LoadBehaviorKey : Cardinal;

begin
if RegQueryDWordValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Office\Excel\Addins\CONNECT_CLASS', 'LoadBehavior', LoadBehaviorKey) then begin
if LoadBehaviorKey <> 3 then begin
bUpdate := True;
end;
end else begin
bUpdate := True;
end;

if bUpdate = True then begin
RegWriteDWordValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Office\Excel\Addins\CONNECT_CLASS','LoadBehavior', 3);
end;

if RegKeyExists(HKEY_CURRENT_USER, 'SOFTWARE\Microsoft\Office\Excel\Addins\CONNECT_CLASS') then begin
if RegDeleteKeyIncludingSubkeys(HKEY_CURRENT_USER, 'SOFTWARE\Microsoft\Office\Excel\Addins\CONNECT_CLASS') then begin;
//MsgBox('Duplicate keys deleted', mbInformation, MB_OK);
end;
end;
end;

function GetCustomSetupExitCode: Integer;
begin
ResetAddinRegKeys;
Result := 0;
end;

对于我的 MSI 安装程序,我让安装的提交部分调用以下 VBScript:

Sub RemoveAddinHKCUKeys()
On Error Resume Next
Dim WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")

WshShell.RegDelete "HKCU\SOFTWARE\Microsoft\Office\Excel\Addins\CONNECT_CLASS\CommandLineSafe"
WshShell.RegDelete "HKCU\SOFTWARE\Microsoft\Office\Excel\Addins\CONNECT_CLASS\Description"
WshShell.RegDelete "HKCU\SOFTWARE\Microsoft\Office\Excel\Addins\CONNECT_CLASS\FriendlyName"
WshShell.RegDelete "HKCU\SOFTWARE\Microsoft\Office\Excel\Addins\CONNECT_CLASS\LoadBehavior"
WshShell.RegDelete "HKCU\SOFTWARE\Microsoft\Office\Excel\Addins\CONNECT_CLASS\"

If Err.Number <> 0 The Err.Clear
End Sub

最佳答案

已经过去很长时间了,我的内存有些模糊,但我确实记得如果主机(Excel、Word)作为嵌入对象启动,则启动 COM 加载项会出现问题。也就是说,您有一个嵌入了 Excel 文档的 Word 文档(您实际上在 Word 中看到了 Excel 单元格)。当您双击嵌入的 Excel 文件来使用它时,Excel 将启动,但 Excel 不会加载其 COM 加载项。然后,当您以任何其他方式启动 Excel 时,您实际上只是使用曾经/已经从嵌入对象运行的 Excel,并且它不会包含您的 COM 加载项。

这似乎不是你的问题,但我想你可能需要一些同情。 ;)

您在 VB6 中使用外接程序设计器吗?我没有遇到任何问题,但您尝试废弃它并直接在类中实现 IDTExtensibility2,然后编写自己的注册表项以将其注册为 COM 加载项。或者以其他方式执行此操作(如果您不使用设计器)。

要尝试的一件事是将加载项注册为计算机范围的加载项,而不仅仅是用户加载项。对于设计器,您只能注册为用户加载项。 (尽管有一个解决方法)。

你能重现吗?是否有任何 IDTEXtensibility2 方法被调用?

我认为其他加载项可能会干扰。您可以下载我的 COM 加载项实用程序来查看加载了哪些加载项(Office 应用程序中的 COM 加载项窗口仅显示用户加载项,而不显示计算机加载项。)

http://www.amosfivesix.com/download/stackoverflow/

如果加载项完全停止加载,则 Office 应用可能已将其禁用。转到帮助|关于 |禁用项目并查看它是否存在。

Excel 有一些与 DDE 相关的愚蠢选项(资源管理器通常使用它在其他应用程序中打开文档。)选项|一般|忽略其他应用程序。看看这是否会产生影响。

如果您无法重现问题,但您的客户端可以,您可以为他们编写一个特殊版本来记录 IDT... 事件以查看它们是否正在发生。向他们发送一个宏,用于检查 Excel.Application.Addins 以查看您的加载项是否存在(我知道 Word 有该对象模型,不确定 Excel 是否有,所以如果没有,请原谅我)。

关于excel - 通过打开文件启动 Excel 时,不加载 Excel 的 COM 加载项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1569729/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com