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

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

一些细节,如果他们帮助:

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

任何想法的原因或如何解决这个将不胜感激。

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

当一个IDTExtensibility2 dll被注册时,它会自动为加载行为,加载项名称等创buildHKCU条目。但是我也有我的设置文件注册到HKLM的加载项,以便所有用户都可以使用机。 这导致系统上的registry项双重。

我不认为这将是问题的原因。 我手动编辑了HKCU的条目,而Excel似乎忽略了它们,并遵循了HKLM的条目。 但是,我收到另一位开发人员的提示,说明他们有同样的问题,他们的解决scheme是删除重复的registry项。 我试了一下,似乎已经解决了报告错误的(非常less的)人的问题。

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

[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)作为一个embedded对象启动,我记得要启动COM加载项才能启动。 也就是说,你有一个embedded了Excel文档的Word文档(实际上你可以在Word中看到Excel单元格)。 当您双击embedded的Excel文件以使用它时,Excel将启动,但Excel不会加载它的COM加载项。 然后,当以任何其他方式启动Excel时,实际上只是使用已经从embedded对象运行的Excel,并且不会有COM加载项。

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

你在VB6中使用附加devise器吗? 我没有遇到任何问题,但是你可以直接在类中实现IDTExtensibility2,然后编写你自己的registry项,把它注册为一个COM加载项。 或者在你周围的其他地方做这个devise。

要做的一件事就是将加载项注册为全机加载项,而不仅仅是用户加载项。 与devise师,你只能注册为用户加载项。 (虽然有这个工作)。

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

我想可能是其他插件可能会干扰。 您可以下载我的COM加载项实用程序以查看加载的加载项(Office应用程序中的COM加载项窗口只显示用户加载项,而不是机器加载项)。

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

如果加载项完全停止加载,Office应用程序可能已禁用它。 转到帮助| 关于| 禁用项目,看看是否在那里。

Excel有一些与DDE相关的愚蠢选项(这是Explorer用来通常在其他应用程序中打开文档的工具) 选项| 一般| 忽略其他应用程序。 看看这是否有所作为。

如果你不能重现问题,但你的客户可以,你可以为他们写一个特殊的版本,loggingIDT事件,看看他们是否正在发生。 发送给他们一个macros,检查Excel.Application.Addins,看看你的加载项是否在那里(我知道Word有这个对象模型,不确定有关Excel,所以请原谅我,如果没有)。

希望这是一些帮助。

-Tom

非常容易在5个步骤

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