有几位用户报告说,如果他们通过双击Excel文件启动Excel,则不会加载该加载项。但是,如果他们通过“开始”菜单(或“快速启动”工具栏)打开Excel,则加载项可以正常加载。
一些细节,以防他们提供帮助:
对于原因或如何排除故障的任何想法都将非常感激。
更新:我相信我找到了解决这个问题的方法。
当注册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
答案 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个步骤轻松完成