2010-08-02 7 views
1

J'ai des problèmes avec mes contrôles .net ne pas être nettoyés correctement lorsqu'ils sont emballés pour une utilisation activeX.Quelle est la bonne façon pour un contrôle activeX (COM) de nettoyer lorsqu'il est fermé par son parent?

Le comportement par défaut laisse l'application du conteneur de test du SDK (TstCon32.exe) s'exécuter en tant que processus GUIless lorsque j'essaie de le fermer.

La solution de contournement que j'ai initialement trouvée via google consistait à remplacer WndProc et à appeler manuellement le Environment.Exit(0). Cela a fait TstCon32.exe pour fermer complètement; Cependant, il casse l'application où j'ai besoin d'avoir le contrôle hébergé. L'application est MDI et WM_DESTROY est envoyé lorsque la page contenant le contrôle est fermée, à quel point l'appel Environment.Exit(0) souffle l'application entière. J'ai essayé Application.Exit() comme alternative, mais cela laisse TstCon32 toujours en cours d'exécution invisiblement.

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

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

J'ai un problème similaire. Avez-vous trouvé une solution? –

+0

@Michael Stoll Je ne pense pas que je l'ai fait –

Répondre

1

En général, un conteneur ActiveX appelleraient IOleObject :: Close et IOleObject :: SetClientSite (null) avant la fermeture. System.Windows.Forms.Control a sa propre implémentation de IOleObject. Je ne pense pas que vous pouvez le remplacer dans une classe dérivée.

L'envoi de WM_QUIT via Application :: Exit n'est pas une option pour MDI, car il fermera l'ensemble du programme au lieu de la page hébergeant l'ActiveX. Si le conteneur fuit des pointeurs d'interface, vous ne pouvez pas faire grand-chose.

L'implémentation IOleObject de System.Windows.Forms.Control appelle uniquement Control.Dispose si le conteneur implémente IHTMLDocument2. Mais je ne pense pas que vous puissiez compter sur le conteneur pour implémenter cette interface.

+0

Merci. Je vais regarder dans les méthodes OLE que vous avez mentionnées. L'application hôte pour laquelle j'écris appartient à une tierce partie, je ne peux donc pas la modifier. –

+0

J'ai bloqué les appels MessageBox dans les deux méthodes IOleObject mentionnées; il semble que ni TstCon32 ni mon application cible n'appellent l'une ou l'autre méthode car les boîtes de message ne sont pas affichées. –

+0

Comment? L'implémentation IOleObject de la classe Windows Forms Control n'est pas visible en externe. –