通过打开文件启动Excel时,Excel加载项无法加载

问题描述:

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

一些细节,万一他们帮助:

  • 这是一个COM加载项,写在VB6。
  • 在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安装程序,我安装的提交区间调用下面的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相关的愚蠢选项(这是Explorer用来在其他应用程序中通常打开文档的工具。选项|一般|忽略其他应用程序。看看这是否有所作为。

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

希望这是一些帮助。

-Tom

+0

@汤姆:你管理当Excel嵌入在其它应用弄清楚这个问题?我遇到了同样的问题,我的COM插件(它将自己的命令条添加到Excel)加载,但添加的命令条不能定制(按钮启用/禁用),除了OnConnection()方法。 – A9S6 2009-12-07 19:21:59

+0

对不起,没有。这对我来说并不是什么大不了的事情。我能够告诉人们“不要这样做”。 ;)或关闭这两个应用程序并按正确的顺序启动它们。我不确定你有什么可以做的。看起来像Office应用程序中的错误。 – 2009-12-10 16:40:34

+0

感谢您的回复。你有一些很棒的想法和评论。 – CtrlDot 2010-03-29 10:13:36

很容易在5个步骤

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