Собственное окно: дескриптор освобождения при закрытии

В настоящее время я работаю над надстройкой 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,

Другие вопросы по тегам