【问题标题】:COM Add-in for Excel doesn't load when Excel is launched by opening file通过打开文件启动 Excel 时,不会加载 Excel 的 COM 加载项
【发布时间】:2010-12-06 21:13:46
【问题描述】:

一些用户报告说,如果他们通过双击 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 com vb6 add-in


    【解决方案1】:

    已经很长时间了,所以我的记忆模糊不清,但我确实记得如果主机(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 相关的愚蠢选项(这是 Explorer 通常用来在其他应用程序中打开文档的工具。)选项 |一般 |忽略其他应用程序。看看会不会有什么不同。

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

    【讨论】:

    • @Tom:当 Excel 嵌入其他应用程序时,您是否设法找出问题?我在加载我的 COM 插件(将自己的命令栏添加到 Excel)时遇到同样的问题,但除了 OnConnection() 方法之外,无法自定义添加的命令栏(启用/禁用按钮)。
    • 对不起,没有。这对我来说真的没什么大不了的。我能够告诉人们“不要那样做”。 ;) 或者关闭两个应用程序并以正确的顺序启动它们。我不确定你能做些什么。似乎是 Office 应用程序中的一个错误。
    • 感谢您的回复。你有一些很棒的想法和方法。
    【解决方案2】:

    非常简单,只需 5 个步骤

    1. 打开 Excel
    2. 转到 文件>选项>加载项
    3. 转到管理:然后选择禁用项目,然后单击转到
    4. 在新窗口中找到您的加载项并单击启用
    5. 重新启动 Excel

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-26
      相关资源
      最近更新 更多