Подтвердить что ты не робот

Что может заставить Outlook изменить COM-addin LoadBehavior на 2 - кроме необработанных исключений?

В течение нескольких недель мы сталкиваемся с проблемой, когда у небольшого числа клиентов наш 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 выгружать нашу добавку, происходит между завершением инициализации оболочки защиты и нашим собственным кодом.

Любые идеи?

4b9b3361

Ответ 1

Просто, чтобы закрыть это: проблема в конечном итоге оказалась вызвана ошибкой в ​​сторонней оболочке лицензирования, которую мы использовали. Он был подтвержден продавцом и был исправлен в последних выпусках.

Ответ 2

Моя компания смирилась с тем, что кажется той же проблемой, которую вы видите годами. У подключаемого модуля есть надстройка VB6 COM для Outlook 2003 и ее развертывание на нескольких сот машинах, которые получают циклические сотни (если не тысячи) раз в день. Мы часто проходим цикл загрузки и выгрузки.

Мы получаем справедливую часть общих ошибок, когда плагин загружается, но не подключен, и мы обрабатываем это в коде. (Очевидно, что это не качество продукции)

Dim outlook As outlook.Application
Set outlook = CreateObject("Outlook.Application")
outlook.COMAddIns("MyFancyDancyPlugin").Connect = True

Редко, но не так редко, что это не раздражение, мы видим, что подключаемый модуль достигает состояния, в котором он загружен, и мы можем увидеть его в "Инструменты" > "Параметры" > "Другие" > "Дополнительные параметры" > "Надстройки над Com", но мы просто не можем подключиться к этой вещи. Если вы попытаетесь подключиться, вы не получите ошибку, он просто переключится обратно на отключенный. [Эквивалент перехода на 2 в разделе реестра] COM-объект, насколько я могу судить, никогда не создается. Элемент не указан в разделе "Отключенные элементы".

Нам действительно не нужно передислоцировать эту ошибку. Удаление объекта через диалог надстройки Com и повторное добавление его, похоже, исправляют проблему. Это все еще не приемлемое решение, но оно возвращает и работает без переустановки.

  • Windows XP Professional, актуальный уровень патча
  • Outlook 2003 Профессиональный, обновленный уровень исправления.
  • различные версии сканирования McAfee Virus (хотя отключение его не влияет - см. выше).
  • Пользователи являются членами группа локальных администраторов

Это похоже на то, что мы не используем McAfee, но вирус-сканер также не взаимодействует с Outlook или надстройками com. Мы также не используем приложение защиты от копирования.

Мне жаль, что я не могу больше помочь, но я бы хотел, чтобы это стало причиной.

Ответ 3

Я также работаю над надстройкой Outlook, и я знаю одну причину, когда надстройка отключена. некоторое время, когда Outlook резко отключается или пользователь принудительно отключает Outlook, добавление отключается. Я не уверен, является ли это причиной в вашем случае, но это может также дать вам некоторое представление о том, что нужно думать. Я некоторое время использую этот метод (закрывая Outlook с помощью диспетчера задач, пока он все еще загружается), чтобы имитировать это поведение, и на самом деле я разработал инструмент, который сканирует все предоставленные ему машины и проверяет, отключена ли надстройка на машине и если да, то это изменяет значение реестра, чтобы включить его.

Ответ 4

Возможно, вы жертва политики блокировки. добавьте ключ обхода в реестр, затем он будет работать. современные офисные версии или vsto создает ключ при установке. эффект: установить современный офис тоже, и adddin теперь также загружены в более старый офис. пожалуйста, посмотрите

фрагмент кода, взятый из NetOffice http://netoffice.codeplex.com

public static void RegisterFunction(Type type)
{
            try
            {
                // add codebase value
                Assembly thisAssembly = Assembly.GetAssembly(typeof(ExampleClassicAddin));
                RegistryKey key = Registry.ClassesRoot.CreateSubKey("CLSID\\{" + type.GUID.ToString().ToUpper() + "}\\InprocServer32\\1.0.0.0");
                key.SetValue("CodeBase", thisAssembly.CodeBase);
                key.Close();

                key = Registry.ClassesRoot.CreateSubKey("CLSID\\{" + type.GUID.ToString().ToUpper() + "}\\InprocServer32");
                key.SetValue("CodeBase", thisAssembly.CodeBase);
                key.Close();

                // add bypass key
                // http://support.microsoft.com/kb/948461
                key = Registry.ClassesRoot.CreateSubKey("Interface\\{000C0601-0000-0000-C000-000000000046}");
                string defaultValue = key.GetValue("") as string;
                if (null == defaultValue)
                    key.SetValue("", "Office .NET Framework Lockback Bypass Key");
                key.Close();

                // add addin key
                Registry.ClassesRoot.CreateSubKey(@"CLSID\{" + type.GUID.ToString().ToUpper() + @"}\Programmable");
                Registry.CurrentUser.CreateSubKey(_addinRegistryKey + _prodId);
                RegistryKey rk = Registry.CurrentUser.OpenSubKey(_addinRegistryKey + _prodId, true);
                rk.SetValue("LoadBehavior", Convert.ToInt32(3));
                rk.SetValue("FriendlyName", _addinName);
                rk.SetValue("Description", "NetOffice COMAddinExample with classic UI");
                rk.Close();
            }
            catch (Exception ex)
            {
                string details = string.Format("{1}{1}Details:{1}{1}{0}", ex.Message, Environment.NewLine);
                MessageBox.Show("An error occured." + details, "Register " + _addinName, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
}

Ответ 5

Если у вас есть возможность для своих пользователей запускать программу отладки, чтобы получить дополнительную информацию о проблеме, когда это произойдет, попробуйте использовать Add-in Spy от Microsoft.

http://msdn.microsoft.com/en-us/library/cc984533(v=office.12).aspx

У меня была надстройка, которая не загружалась и обнаружила, что это происходит, потому что зависимость не была предварительно загружена. Этот инструмент должен быть в состоянии рассказать вам, какая конкретная ошибка происходит, когда надстройка Outlook не загружается.