2010-06-02 4 views
0

Je dois charger un contrôle utilisateur WPF dans une boîte de dialogue MFC appelée à partir du contrôle ocx. Pour cela, j'ai créé une DLL régulière MFC (Mixed Mode Regular dll avec l'option clr activée), j'ai créé un dialogue dans ce qui héberge le contrôle de l'utilisateur wpf en utilisant HWndSource. Cette boîte de dialogue exportée est placée en tant que boîte de dialogue enfant de la boîte de dialogue MFC au-dessus de MFC invoquée depuis l'ocx. La boîte de dialogue intermédiaire de Ny utilise le code C++/Cli.Perte de mémoire continue lors de l'utilisation de WpfHWndSource

Lorsque la boîte de dialogue MFC principale est fermée, je supprime la référence ptr de la boîte de dialogue intermédiaire créée sur le tas. Mais après cela, je vois toujours une fuite de mémoire continue ou une croissance. Dans le destructeur de la boîte de dialogue, j'appelle la suppression sur le HWndSource et le contrôle utilisateur wpf, de sorte que son élimination doit être appelée.

Mais je vois une fuite continue après.

Toute aide à cet égard serait utile.

+0

"J'appelle la suppression sur le contrôle utilisateur HWndSource et le contrôle utilisateur wpf, afin que son élimination soit appelée". Huh? 1. Les contrôles HWndSource et WPF sont des objets gérés, donc il n'y a pas de "delete" à appeler. 2. Dispose est complètement optionnel (vous ne pouvez pas perdre de mémoire en oubliant de l'appeler). Veuillez clarifier ce que vous avez réellement fait et ce que vous attendiez. –

Répondre

0

Pourrait voir quelques problèmes dans google, avec une fuite continue de 4kb en utilisant HWndSource. Mon problème semble être simialr à cela.

WPF Memory Leak on XP (CMilChannel, HWND)

J'ai simulé cette question dans un échantillon MFC Dilaog application qui est similaire à ma demande de développement réel. Dans le constructeur de l'application, j'ai d'abord créé un objet HWndSource factice et il semble montrer une amélioration de la fuite de la mémoire.

J'ai ajouté une autre fonction exportée dans ma DLL mfc régulière clr activée qui crée la source HWndSource. J'appelle cette fonction exportée du constructeur de mon application.

void CConnectionPanelExport::CreateHwndSource() 
{ 
    HWND hwnd = (HWND)(gcnew System::Windows::Interop::HwndSource(*gcnew 
     System::Windows::Interop::HwndSourceParameters("MyApplication")))->Handle.ToPointer(); 
    CWnd *temp= CWnd::FromHandle(hwnd); 
    temp->ShowWindow(SW_HIDE); 
} 

De mon constructeur de l'application, j'ai appelé

CConnectionPanelExport connectionPanelExport; 
connectionPanelExport.CreateHwndSource(); 

Cela semble garder la mémoire de l'application dans le contrôle, mais vraiment je ne pouvais pas comprendre le gros problème.

J'ai essayé d'implémenter ceci dans mon application de développement actuelle et je vois que l'application est fermée quand j'appelle cette méthode exportée de la DLL/clr activée. Je crée une liaison statique de la DLL clr activée dans une application principale non clr activée

+1

Vous devez utiliser le bouton Modifier sous votre question au lieu d'afficher une «réponse» pour ajouter des informations. –

Questions connexes