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

时间:2009-10-15 00:36:26

标签: excel com vb6 add-in

有几位用户报告说,如果他们通过双击Excel文件启动Excel,则不会加载该加载项。但是,如果他们通过“开始”菜单(或“快速启动”工具栏)打开Excel,则加载项可以正常加载。

一些细节,以防他们提供帮助:

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

对于原因或如何排除故障的任何想法都将非常感激。

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

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

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

下面的Inno设置代码将添加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安装程序,我有安装的commit部分调用以下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

2 个答案:

答案 0 :(得分:3)

已经很长一段时间了,所以我的记忆很模糊,但我确实记得如果主机(Excel,Word)作为嵌入对象启动,启动COM加载项会出现问题。也就是说,您有一个Word文档,其中嵌入了Excel文档(您实际上在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,所以请原谅我,如果没有)。

希望这有所帮助。

- 汤姆

答案 1 :(得分:2)

通过5个步骤轻松完成

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