通过打开文件启动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
很容易在5个步骤
- 打开Excel
- 转到文件>选项>加载项
- 转到管理:然后选择残疾人项目然后点击转到
- 在新窗口中找到您的加载项并单击启用
- 重新启动Excel
@汤姆:你管理当Excel嵌入在其它应用弄清楚这个问题?我遇到了同样的问题,我的COM插件(它将自己的命令条添加到Excel)加载,但添加的命令条不能定制(按钮启用/禁用),除了OnConnection()方法。 – A9S6 2009-12-07 19:21:59
对不起,没有。这对我来说并不是什么大不了的事情。我能够告诉人们“不要这样做”。 ;)或关闭这两个应用程序并按正确的顺序启动它们。我不确定你有什么可以做的。看起来像Office应用程序中的错误。 – 2009-12-10 16:40:34
感谢您的回复。你有一些很棒的想法和评论。 – CtrlDot 2010-03-29 10:13:36