Как правильно очистить элемент управления ActiveX (COM) при закрытии его родителем? - PullRequest
2 голосов
/ 02 августа 2010

У меня проблемы с тем, что мои элементы управления .net не очищаются должным образом при переносе для использования в ActiveX.

Поведение по умолчанию оставляет приложение тестового контейнера SDK (TstCon32.exe) работающим как процесс без GUI, когда я пытаюсь закрыть его.

Обходной путь, который я первоначально нашел через Google, состоял в том, чтобы переопределить WndProc и вызвать Environment.Exit(0) вручную.Это заставило TstCon32.exe полностью завершить работу;однако это ломает приложение, где мне нужно разместить контроль.

Приложение является MDI, и WM_DESTROY отправляется, когда страница, содержащая элемент управления, закрыта, после чего вызов Environment.Exit(0) уничтожает все приложение.Я попробовал Application.Exit() в качестве альтернативы, но из-за этого TstCon32 все еще работает невидимо.

protected override void WndProc(ref Message m)
{
    base.WndProc(ref m);

    // WM_DESTROY
    if (m.Msg == 2)
        Environment.Exit(0);
}

1 Ответ

1 голос
/ 03 августа 2010

Как правило, контейнер ActiveX будет вызывать IOleObject :: Close и IOleObject :: SetClientSite (null) перед закрытием. System.Windows.Forms.Control имеет собственную реализацию IOleObject. Я не думаю, что вы можете переопределить его в производном классе.

Отправка WM_QUIT через Application :: Exit не является опцией для MDI, так как закрывает всю программу вместо страницы, содержащей ActiveX. Если в контейнере просочились указатели интерфейса, вы ничего не можете сделать.

Реализация IOleObject System.Windows.Forms.Control вызывает Control.Dispose, только если контейнер реализует IHTMLDocument2. Но я не думаю, что вы можете рассчитывать на контейнер для реализации этого интерфейса.

...