【发布时间】:2010-12-06 21:13:46
【问题描述】:
一些用户报告说,如果他们通过双击 Excel 文件来启动 Excel,加载项将不会加载。但是,如果他们通过开始菜单(或快速启动工具栏)打开 Excel,加载项加载正常。
一些细节,如果他们有帮助的话:
- 它是一个 COM 插件,用 VB6 编写。
- 此问题已在 Windows XP/Excel 2003 和 Vista/Excel 2007 系统上报告。
- 加载项实现 IDTExtensibility2。
- 启动模式设置为“启动时加载”。
任何关于原因或如何解决此问题的想法将不胜感激。
更新:我相信我已经找到了解决这个问题的方法。
注册 IDTExtensibility2 dll 后,它会自动为加载行为、加载项名称等创建 HKCU 条目。但我也让我的设置文件将加载项注册到 HKLM,以便所有人都可以使用它机器上的用户。这会导致系统上出现双重注册表项。
我认为这不是问题的原因。我手动编辑了 HKCU 条目,Excel 似乎忽略了它们并遵循 HKLM 条目。但是,我收到另一位开发人员的提示,解释说他们有同样的问题,他们的解决方案是删除重复的注册表项。我试过了,它似乎已经解决了(极少数)报告错误的人的问题。
下面的 Inno Setup 代码将添加 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
【问题讨论】: