Handle m_hWnd in einer DLL
-
Hallo,
ich möchte das Handle m_hWnd meiner MDI Anwendung an eine DLL übergeben.
Hierzu habe ich in der DLL eine Funktion folgendermaßen deklariert:bool CInitDevice::Settings(CWnd *Fenster)
diese Funktion rufe ich in meiner exe auf:
Settings(this);
um nun an mein Handle zu kommen, benutze ich die Attach-Funktion in der DLL:
HWND m_hMyWnd = NULL; Fenster->Attach(m_hMyWnd);
Problem: beim Ausführen von Attach stürzt das Prog ab. (Fehler:Debug Assertion Faild in wincore.cpp)
WARUM???Danke für Eure Ideen.
Thomas
-
Hi,
du gehst die Sache genau falsch rum an.
Attach ist dafür gedacht ein lokales CWnd Objekt mit dem CWnd eines fremden Threads zu "verbinden" damit es in der Handle Map des aktuellen Threads auftaucht.Dafür musst du aber das Handle übergeben und nicht den CWnd Pointer.
Dein Pointer wird in der permanenten Handle Map nicht gefunden und deshalb wird ein temporäres "Standard"-Objekt vom Typ CTempWnd angelegt.MfG Spacelord
-
Ok, hab ich geschnallt. Wie komme ich aber in der DLL an das Handle der MDI - Anwendung. Habe folgendes probiert, geht auch ohne Absturz, nur m_hMyWnd stimmt nicht mit dem der MDI überein:
HWND m_hMyWnd = Fenster->m_hWnd;
-
Du musst deiner Methode den Handle des Fensterobjekts übergeben.
Etwa so:bool CInitDevice::Settings(HANDLE hwnd) { CDeinFensterTyp deinLokalesFenster; deinLokalesFenster.Attach(hwnd); //irgendwas mit deinLokalesFenster machen deinLokalesFenster.Detach(); }
MfG Spacelord
-
Hi,
hab jetzt durch debuggen rausgefunden, wo in einem Objekt von CWnd was steht...
Darufhin hab ich das ganze so gemacht:bool CMeineFunktion::Settings(CWnd *Fenster) { //Neues Objekt von der Klasse CWnd erstellen CWnd *Fenster1; //Dem Objekt den Handle übergeben Fenster1 = Fenster->GetOwner(); m_hOurWnd = Fenster1->m_hWnd; return true; }
So funktionierts...
Vielen Dank!