3

ActiveX用にラップしたときに.netコントロールが適切にクリーンアップされないという問題があります。

デフォルトの動作では、SDKのテストコンテナアプリ(TstCon32.exe)を閉じようとすると、GUIなしのプロセスとして実行されたままになります。

私が最初にグーグルで見つけた回避策は、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);
}
4

1 に答える 1

2

通常、ActiveX コンテナーは、閉じる前に IOleObject::Close および IOleObject::SetClientSite(null) を呼び出します。System.Windows.Forms.Control には、IOleObject の独自の実装があります。派生クラスでオーバーライドできるとは思いません。

Application::Exit 経由で WM_QUIT を送信することは、ActiveX をホストしているページではなくプログラム全体を閉じるため、MDI のオプションではありません。コンテナーがインターフェイス ポインターをリークしている場合、できることはあまりありません。

System.Windows.Forms.Control の IOleObject 実装は、コンテナが IHTMLDocument2 を実装している場合にのみ Control.Dispose を呼び出します。しかし、このインターフェースを実装するためにコンテナーを当てにできるとは思いません。

于 2010-08-02T21:28:19.303 に答える