Собственное окно: дескриптор освобождения при закрытии
В настоящее время я работаю над надстройкой C# .NET для Microsoft Outlook. Цель надстройки состоит в том, чтобы захватить результаты поиска из мгновенного поиска Outlook и отобразить в настраиваемой панели мои собственные результаты поиска.
Он работает довольно хорошо, и с помощью подкласса окна Outlook с собственным окном я получаю строку поиска, и она уже передает ее в мою панель.
Проблема заключается в том, что при закрытии надстройки (через "Файл-> Параметры-> Надстройки-> Надстройки COM", но не с X на панели) надстройка немедленно завершается и я не могу позвонить searchboxWindow.ReleaseHandle()
заранее восстановить мою цепочку WndProc. Outlook просто вылетает без видимых ошибок.
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
switch ((uint)m.Msg)
{
case WindowMessages.WM_DESTROY:
case WindowMessages.WM_QUIT:
case WindowMessages.WM_NCDESTROY:
this.ReleaseHandle();
return;
case WindowMessages.WM_KEYUP:
case WindowMessages.WM_LBUTTONDOWN:
case WindowMessages.WM_RBUTTONDOWN:
OnKeyUp();
break;
case WindowMessages.WM_EXITSIZEMOVE:
OnResize();
break;
}
}
Я уже пытался прослушать несколько оконных сообщений, которые должны вызываться, когда надстройка закрывается, но эти сообщения появляются только при нормальном закрытии Outlook.
Кроме того, события в основном исходном файле надстройки, такие как AppDomain.CurrentDomain.ProcessExit
, this.Shutdown
, или же ((Outlook.ApplicationEvents_10_Event)this.Application).Quit
не звони.
Какое событие я могу прослушать, когда (надёжно) запускается, когда надстройка прекращается? Есть ли некоторые? Если нет, какие альтернативы для решения моей проблемы у меня есть?
2 ответа
Решено: спасибо Гансу Пассанту
Это действительно кажется, что ThisAddIn_Shutdown
Событие инициируется, когда надстройка отключается вручную через диалоговое окно Надстройки COM.
Убедитесь, что вы добавили DWORD RequireShutdownNotification=1 в реестр надстройки, в противном случае ThisAddIn_Shutdown() не будет вызываться
Я не думаю, что вы можете многое сделать в управляемом коде. Неповрежденный код работал бы нормально; система COM будет вежливо спросить вас, можно ли выгрузить вашу dll, вызвав вашу реализацию DllCanUnload
,