Несколько пользователей сообщили, что если они запустили Excel, дважды щелкнув файл Excel, надстройка не будет загружаться. Но, если они открывают Excel через меню "Пуск" (или панель быстрого запуска), надстройка загружается штрафом.
Некоторые детали, если они помогают:
- Это надстройка COM, написанная на VB6.
- Проблема была обнаружена в системах Windows XP/Excel 2003 и Vista/Excel 2007.
- Надстройка реализует IDTExtensibility2.
- Режим запуска установлен на "Загрузка при запуске".
Любые мысли о причине или о том, как устранить эту проблему, будут очень признательны.
Обновление: я считаю, что нашел решение этой проблемы.
Когда зарегистрирована IDL IDTExtensibility2, она автоматически создает записи HKCU для поведения загрузки, имени надстройки и т.д. Но у меня также был установлен файл настроек для надстройки HKLM, чтобы он был доступен всем пользователей на машине. Это вызвало двойные записи реестра в системе.
Я не думал, что это будет причиной проблемы. Я вручную отредактировал записи HKCU, и Excel, казалось, проигнорировал их и выполнил записи HKLM. Тем не менее, я получил отзыв от другого разработчика, объяснив, что у них такая же проблема, и их решением было удалить повторяющиеся записи в реестре. Я попробовал это и, похоже, решил проблему для (очень небольшого числа) людей, сообщивших об ошибке.
В приведенном ниже коде Inno Setup будут добавлены записи HKLM, дважды проверьте правильность поведения загрузки (поскольку я параноик), а затем удалите запись HKCU. Подставляйте свои атрибуты файла везде, где вы видите ВСЕ CAPS.
[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