В течение нескольких недель мы сталкиваемся с проблемой, когда у небольшого числа клиентов наш Outlook addin выгружается и отключается по еще неопределенным причинам. Под "отключенным" я подразумеваю, что Outlook изменяет следующее значение реестра от 3 до 2, что фактически означает, что добавление не будет загружено при следующем запуске:
HKEY_LOCAL_MACHINE\Software\Microsoft\Office\Outlook\Addins\[OurAddin.sProgID]\LoadBehavior
Нет сообщения об ошибке, и в журнальных файлах, созданных нами, не появляется никаких исключений.
Я уже нашел следующую страницу, в которой конкретно рассматривается проблема с заменой LoadBehavior: http://blogs.msdn.com/vsod/archive/2008/04/22/Troubleshooting-com-add-in-load-failures.aspx
Однако ни одна из возможных причин, предложенных там, не применима:
- Добавление не просто указано в списке "Отключенные элементы".
- В методах
IDTExtensibility2
и нигде в коде нет никаких необработанных исключений. Весь код обернут в эквиваленты try/catch, и все выходные данные исключения выводятся только черезOutputDebugString
или в файл журнала. - Ошибка, как представляется, не зависит от антивирусного программного обеспечения, т.е. также происходит с отключенным.
- Отключение всех других добавок также не влияет на ошибку.
Итак, что еще может заставить Outlook отключить добавление?
Некоторые подробности/наблюдения:
- Нам пока не удалось воспроизвести проблему в наших тестовых средах, поэтому мы еще не смогли подключить отладчик, когда проблема возникла.
- Проблема никогда не возникает, когда мы пытаемся наблюдать за тем, что происходит с помощью удаленной поддержки (TeamViewer). Я подозреваю, что это связано с тем, что TeamViewer использует библиотеку hook, которая внедряет себя во все запущенные процессы (включая Outlook) и, таким образом, влияет на расположение памяти, время, порядок потоков, что угодно.
- Всякий раз, когда мы скомпилируем новую версию addin, чтобы попробовать что-то новое, addin, как правило, отлично работает в течение нескольких часов или даже дней, чтобы в конечном итоге снова отключиться. Как только это произошло, все последующие попытки получить аддон для загрузки на этом компьютере (путем изменения значения LoadBehavior вручную) будут терпеть неудачу (то есть LoadBehaviour просто изменится на 2), пока мы не скомпилируем и не развернем другую сборку (или попытаемся просмотреть TeamViewer - см. Выше).
- Обычно добавление будет выгружено сразу при запуске Outlook, хотя иногда это также происходит после того, как Outlook уже работает некоторое время. Файл журнала в этих случаях выглядит совершенно незащищенным - добавление просто проходит через обычные шаги выключения так же, как если бы Outlook был закрыт нормально.
- Насколько я могу судить по нашим файлам журналов и наблюдая проблему через SysInternals ProcessMonitor, когда аддон отключается при запуске Outlook (а не во время сеанса), DLL выгружается даже до COM-объекта (т.е. добавление ) получает экземпляр (сообщения журнала в конструкторе никогда не отображаются).
- Мы разместили сообщения
OutputDebugString
в разделахinitialization
(это DLL Delphi). Ни один из них не появляется, когда аддон не загружается. -
Эта проблема затрагивает только очень небольшую часть наших клиентов. У нас есть несколько десятков тысяч установок, от которых мы не получили никаких сообщений об этом.
-
UPDATE: Похоже, что часто (но не всегда) одна из последних вещей, которые регистрируются до того, как addin выгружается, является исключением из текста "Ошибка OLE 800A01A8". Это исключение попадает в глобальный обработчик исключений, встроенный в используемую мной инфраструктуру (Add-in-Express) и не появляется откуда-либо из моего места собственный код, каждый из которых до сих пор полностью завернут в
try..catch
. Обычно это происходит сразу после того, как я установил видимость моих CommandBarButtons из обработчика события Activate Activate.
Общие свойства всех затронутых машин:
- Windows XP Professional, обновленный уровень исправления.
- Outlook 2003 Professional, обновленный уровень исправления.
- различные версии McAfee Virus Scan (хотя его отключение не имеет эффекта - см. выше)
- Пользователи являются членами локальной группы администраторов.
Еще одно замечание, которое, вероятно, также значимо (хотя, может быть, и не так сильно, как я думал):
Мы используем модуль защиты от копирования/копирования от стороннего поставщика, который обертывает скомпилированную DLL в "оболочку" и только распаковывает ее на лету. С тех пор, как я узнал, что аддон выгружается даже до того, как какой-либо из наших собственных кодов будет выполнен, это был мой главный подозреваемый. Однако, хотя поставщик подтвердил, что в их коде могут быть необработанные исключения, файл журнала, созданный специальной версией оболочки для защиты от отладки, показал, что процесс распаковки завершен успешно, и контроль уже был возвращен в защищенную DLL до того, как Outlook выгрузил добавление, Таким образом, похоже, что все, что заставляет Outlook выгружать нашу добавку, происходит между завершением инициализации оболочки защиты и нашим собственным кодом.
Любые идеи?