Ответ 1
Просто, чтобы закрыть это: проблема в конечном итоге оказалась вызвана ошибкой в сторонней оболочке лицензирования, которую мы использовали. Он был подтвержден продавцом и был исправлен в последних выпусках.
В течение нескольких недель мы сталкиваемся с проблемой, когда у небольшого числа клиентов наш 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 отключить добавление?
Некоторые подробности/наблюдения:
OutputDebugString
в разделах initialization
(это DLL Delphi). Ни один из них не появляется, когда аддон не загружается.Эта проблема затрагивает только очень небольшую часть наших клиентов. У нас есть несколько десятков тысяч установок, от которых мы не получили никаких сообщений об этом.
UPDATE: Похоже, что часто (но не всегда) одна из последних вещей, которые регистрируются до того, как addin выгружается, является исключением из текста "Ошибка OLE 800A01A8". Это исключение попадает в глобальный обработчик исключений, встроенный в используемую мной инфраструктуру (Add-in-Express) и не появляется откуда-либо из моего места собственный код, каждый из которых до сих пор полностью завернут в try..catch
. Обычно это происходит сразу после того, как я установил видимость моих CommandBarButtons из обработчика события Activate Activate.
Общие свойства всех затронутых машин:
Еще одно замечание, которое, вероятно, также значимо (хотя, может быть, и не так сильно, как я думал):
Мы используем модуль защиты от копирования/копирования от стороннего поставщика, который обертывает скомпилированную DLL в "оболочку" и только распаковывает ее на лету. С тех пор, как я узнал, что аддон выгружается даже до того, как какой-либо из наших собственных кодов будет выполнен, это был мой главный подозреваемый. Однако, хотя поставщик подтвердил, что в их коде могут быть необработанные исключения, файл журнала, созданный специальной версией оболочки для защиты от отладки, показал, что процесс распаковки завершен успешно, и контроль уже был возвращен в защищенную DLL до того, как Outlook выгрузил добавление, Таким образом, похоже, что все, что заставляет Outlook выгружать нашу добавку, происходит между завершением инициализации оболочки защиты и нашим собственным кодом.
Любые идеи?
Просто, чтобы закрыть это: проблема в конечном итоге оказалась вызвана ошибкой в сторонней оболочке лицензирования, которую мы использовали. Он был подтвержден продавцом и был исправлен в последних выпусках.
Моя компания смирилась с тем, что кажется той же проблемой, которую вы видите годами. У подключаемого модуля есть надстройка 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. Мы также не используем приложение защиты от копирования.
Мне жаль, что я не могу больше помочь, но я бы хотел, чтобы это стало причиной.
Я также работаю над надстройкой Outlook, и я знаю одну причину, когда надстройка отключена. некоторое время, когда Outlook резко отключается или пользователь принудительно отключает Outlook, добавление отключается. Я не уверен, является ли это причиной в вашем случае, но это может также дать вам некоторое представление о том, что нужно думать. Я некоторое время использую этот метод (закрывая Outlook с помощью диспетчера задач, пока он все еще загружается), чтобы имитировать это поведение, и на самом деле я разработал инструмент, который сканирует все предоставленные ему машины и проверяет, отключена ли надстройка на машине и если да, то это изменяет значение реестра, чтобы включить его.
Возможно, вы жертва политики блокировки. добавьте ключ обхода в реестр, затем он будет работать. современные офисные версии или 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);
}
}
Если у вас есть возможность для своих пользователей запускать программу отладки, чтобы получить дополнительную информацию о проблеме, когда это произойдет, попробуйте использовать Add-in Spy от Microsoft.
http://msdn.microsoft.com/en-us/library/cc984533(v=office.12).aspx
У меня была надстройка, которая не загружалась и обнаружила, что это происходит, потому что зависимость не была предварительно загружена. Этот инструмент должен быть в состоянии рассказать вам, какая конкретная ошибка происходит, когда надстройка Outlook не загружается.