COM-надстройка для Excel не загружается при запуске Excel, открывая файл

Несколько пользователей сообщили, что если они запустили 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

Ответ 1

Это было долгое время, поэтому моя память туманная, но я действительно помню проблемы с получением надстроек COM для запуска, если хост (Excel, Word) запущен как внедренный объект. То есть у вас есть документ Word с встроенным в него документом Excel (на самом деле вы видите ячейки Excel в Word). При двойном щелчке по встроенному файлу Excel для работы с ним запускается Excel, но Excel не загружает надстройки COM. Затем, когда вы запускаете Excel любым другим способом, вы действительно используете Excel, который был/уже запущен из встроенного объекта, и у него не будет надстроек COM.

Это не твоя проблема, но я думал, что тебе может понравиться какая-то симпатия.;)

Используете ли вы конструктор надстроек в VB6? У меня не было проблем с этим, но вы пытаетесь сломать его и реализовать IDTExtensibility2 непосредственно в классе, а затем записывать свои собственные записи реестра, чтобы зарегистрировать его как надстройку COM. Или сделайте это, пока вы не используете дизайнера.

Одна вещь, которую следует попробовать, - зарегистрировать надстройку как общесистемную надстройку, а не только пользовательскую надстройку. С дизайнером вы можете регистрироваться только как пользовательская надстройка. (Хотя для этого есть работа).

Можете ли вы воспроизвести его? Вызывается ли какой-либо из методов IDTExtensibility2?

Я полагаю, что возможны другие надстройки. Вы можете загрузить мою надстройку COM-надстройки, чтобы посмотреть, какие надстройки загружены (окна надстроек COM в приложениях Office показывают только пользовательские надстройки, а не надстройки машин.)

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

Если надстройка полностью перестанет загружаться, приложение Office может отключить его. Перейти к справки | О проекте | Отключенные элементы и посмотреть, есть ли там.

В Excel есть несколько тупых опций, связанных с DDE (что обычно использует Explorer для открытия документов в других приложениях). Инструменты | Варианты | Общий | Игнорируйте другие приложения. Посмотрите, если это имеет значение.

Если вы не можете воспроизвести проблему, но ваш клиент может, вы можете написать для них специальную версию, которая регистрирует события IDT..., чтобы увидеть, если они происходят. Отправьте им макрос, который проверяет Excel.Application.Addins, чтобы увидеть, есть ли надстройка (я знаю, что у Word есть эта объектная модель, не уверен в Excel, поэтому простите меня, если это не так).

Надеюсь, что какая-то помощь.

-Tom

Ответ 2

Очень легко в 5 шагов

  • Открыть Excel
  • Перейдите к File>Options>Add-Ins
  • Перейдите в Управление: затем выберите Disabled Items, затем нажмите Go
  • В новых окнах Найдите свои надстройки и нажмите Enable
  • Перезагрузка Excel