Datenaustausch zwischen fenstern
-
hallo,
ich möchte einem fenster über createwindow einen zeiger auf eine statische datenstruktur eines anderen fensters übergeben, beim neuen fenster kommt dann aber nichts sinnvolles an. hier mein code
BOOL CALLBACK Dlg (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { ... static int a = 5, *ptr = &a; ... CreateWindow (... , (LPVOID) ptr); } LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static int a, *ptr; switch (message) { case WM_CREATE: ptr = (int *) lParam; a = *ptr;wäre für jeden tip dankbar
-
Hoi,
Also der letzte Param. von CreateWindow bzw. CreateWindowEx ist nicht 'frei verfübar', sondern für ein Zeiger auf ein CREATESTRUCT bzw. ein CLIENTCREATESTRUCT (für MDI's) vorgesehen, du kannst da also nicht irgendwelche Daten 'reinpacken'

Eine mögliche Lösung:
Du könntest globale Variablen benutzen, auf die ja dann beide (alle) Fenster zurückgreifen können.Zweite mögliche Lösung:
Du kannst mit SetWindowLong(hWnd, GWL_USERDATA, (LONG)&pvData); deinem Fenster 'ein zusätzliches Datenpacket zuweisen'. Der letzte Param. ist also eine Adressenvar. die dann auf ein beliebigen Speicherbereich zeigen kann (zB. Struct). Mit GetWindowLong(hWnd, GWL_USERDATA); kannst du dir den Zeiger zu jeder Zeit holen.Hoffe ich konnte helfen

MfG CodeFinder
-
lpParam
[in] Pointer to a value to be passed to the window through the CREATESTRUCT structure passed in the lParam member of the WM_CREATE message sent to the created window by this function before it returns.also
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int a, *ptr; switch (message) { case WM_CREATE: ptr = (int*) ((LPCREATESTRUCT)lParam)->lpCreateParams; a = *ptr;
-
tausend dank, endlich kommt mal was an. habs jetzt mit setwindlowlong gemacht.
gruß christian
-
so, hab jetzt doch wieder ein problem. hier die codestelle, an der anscheinend gemeckert wird
BOOL CALLBACK RectDlg (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static int a; ... data = a; hwnd2 = CreateWindow (...); SetWindowLong (hwnd2, GWL_USERDATA, (LONG) &data); ShowWindow (hwndPaint, SW_SHOWNORMAL); } LRESULT CALLBACK PaintWndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static int *p2data, a; switch (message) { case WM_CREATE: p2data = (t_exchange *) GetWindowLong (hwnd, GWL_USERDATA); a = *p2data //<- Error ...und dann gibts immer nen error.
kann es sein, dass ich irgendwie die reihenfolge von setWindowLong und GetWindowLong durcheinander gebracht habe? Ich meine, dass ich GetWindowLong nicht in WM_CREATE auffrufen kann, weil ich da ja noch kein SetWindowLong gestzt habe? und wenn ja, wie kann ich das problem umgehen?
-
hi nochmal^^,
Wie ist denn
data
definiert/deklariert ?_________________________________________________
Was ist bitte das hier: (t_exchange
inp2data = (t_exchange *) GetWindowLong (hwnd, GWL_USERDATA);...glaub du baust mit deinen Casts scheiße
...MfG CodeFinder
-
Der Vollständigkeit halber wollte ich noch eine weitere Möglichkeit erwähnen, auch wenn ihr das Problem bereits anders löst. Man kann auch über Pipes Daten austauschen. Sowohl zwischen verschiedenen Fenstern als auch Programmen und Rechnern. Ist aber wahrscheinlich für den zweck ungeeignet und viel zu viel Aufwand.
-
Jo weiß ich, aber wie du schon sagtest, Pipes sind hier zu viel des Guten...

Aber der Vollständigkeit halber, ...doch gute Idee

MfG CodeFinder
-
Ja das hast du schon richtig erkannt, warum das nicht gehen kann.
The WM_CREATE message is sent when an application requests that a window be created by calling the CreateWindowEx or CreateWindow function. (The message is sent before the function returns.)
-
so habs jetzt über createwindow und lparam gesendet und dann mit WebNubbis
ptr = (int*) ((LPCREATESTRUCT)lParam)->lpCreateParams;umgewandelt (hat komischerweise beim ersten versuch gar nicht und beim zweiten, 20 min später, auf anhieb geklappt?! wohl mal wieder nicht aufgepasst)
t_exchange ist aus meinem code. wollte das hier eigentlich mit int übersichtlich halten, hab da aber wohl einen übersehen.
danke nochmal für die schnelle hilfe, ist wirklich n super forum hier.
weiter so
