Werte aus WPARAm und LPARAM casten
-
Hi Leute,
ich schreibe das mal als extra Thread in der Hoffnung merh antworten zu erhalten. @ReneG und Konsoerten : Also nicht schließen.
So ich löse ein eigened Event bei eine anderen App aus. Nun sende ich ja mit PostMessage(...) einen WPARAM und einen LPARAm. Wie kann ich hiermit einen Pointer einer Klasse oder Struktur senden und diesen in einer Funktion die von der Message aktiviert wird verabeiten.Mit einfach casten funzt es nicht. Und nen Klassenobjekt wollte er auch nicht nehmen, wie CString.Gruß,
Stalin
-
WM_COPYDATA
-
Müsste schon gehen.
Bei mir geht so was.(innerhakb vom Programm)#
Auf was Castest du?
-
Jover: geht aber nicht cross-app. Kommt zum Glück immer Mist raus...
-
Hallo peterchen oder wer auch immer,
wie kann ich es dann machen?
Ich meine, sorry das ich nerve mit meiner Unwissenheit, aber ich hab es nicht genau verstanden wie es funktioniern soll mit der COPYDATASTRUCT. Kannst du ein Beispiel posten. Ich stehecht auf der Leitung.
Gibt es sonst keine Möglichkeit? Wie kann ich ein errechnetes Ergebnis wieder zurückschaufeln?Gruß,
Stalin
-
Wenn du vom Hauptthread auf den Arbeitsthread zugreifen kannst, kannst du etwas in der Art versuchen...
Membervariable im Arbeitsthread - da die zu übergebenden Daten merken.
Die von Hauptthread aus abfragen, wenn gesagt wurde, dass es sich lohnt.Irgendwie so müsste es gehen.
-
OK, ich tipp ein bißchen langsamer, zum mitmeißeln
In das COPYDATASTRUCT dürfen nur "flache" daten rein, also nix, was Zeiger enthält.
Wenn du Daten zurückschicken willst, mußt du eine WM_COPYDATA - message in die andere Richtung schicken.
Am besten schickt man mit der "Hello" Message (die das andere Fenster sucht) gleich sein eigenes HWND mit- da hat der andere gleich ein Window-Handle zum antworten. Außerdem kommt auch beim// z.B. einen CString an Empfänger senden CString s = .... COPYDATASTRUCT cds; cds.dwData = 42; // beliebige Zahl, kann beim Empfäger ausgewertet werden cds.lpData = (LPCTSTR) s; // (LPCTSTR) s gibt einen NUll-Terminierten "TCHAR const *" auf den string zurück cds.cbData = (s.GetLength() + 1) * sizeof(TCHAR); // Anzahl der Bytes: stringlänge, +1 für '\0'-Ende, *sizeof(TCHAR) für ANSI/UNICODE DWORD dwResult; LRESULT ok = SendMessageTimeout(hwndOfOtherApp, WM_COPYDATA, m_hWnd, (LPARAM) &cds, SMTO_ABORTIFHUNG, 2000, &dwResult); if (!ok) { // some error occured, call GetLastError to find out more } else { // Andere App hat String empfangen, Rückgabewert in dwResult } // Im Empfänger: LRESULT OnMessageCopyData(WPARAM wp, LPARAM lp) // Message-Handler für WM_COPYDATA { HWND hwndOfSender = (HWND) wp; // Windowhandle des Absenders COPYDATASTRUCT & cds = *(COPYDATASTRUCT *) lp; if (cds.dwData == 42) // Aha! Die 42 kann z.B. bedeuten "hier kommt ein String" - ganz nach belieben { LPCTSTR strPtr = (LPCTSTR) cds.lpData; // cds.lpData zeigt auf ene Kopie der gesendeten Daten (in unserem Falle des Strings) // diese Kopie ist leider nur innerhalb des Message-Handlers gültig, also müssen wir ihn umkopieren CString s = strPtr; // CString-Constructor erzeugt eine tiefe Kopie. return TRUE; // das bekommet der Sender dann angeblich in dwResult zurück } return FALSE; }
Alles unklar?
-
Danke, hab's abgemeißelt...