B
hustbaer schrieb:
Das System "kennt" WM_COPYDATA, und kopiert die Daten entsprechend in den Zielprozess. Der Zeiger auf den Datenblock wird dabei auch entsprechend angepasst. Das bedeutet auch, dass du in dem über WM_COPYDATA kopierten Block a) keine absoluten Adressen verwenden darsft und b) sowieso keine Zeiger ablegen darfst, die auf ausserhalb des kopierten Datenblocks zeigen.
Falls du zeiger *innerhalb* des Datenblocks brauchst, musst du diese relativ kodieren. z.B. als Offset zum Anfang des Datenblocks, oder als Offset zur Adresse wo der Zeiger selbst abgelegt ist.
Okay, ich muss sowieso nur den einen Speicherbereich von __argv[1] kopieren, von daher ist ja alles paletti:
Der Speicherbereich von
__argv[1][0] bis __argv[1][lstrlen(__argv[1]) + sizeof(TCHAR) - 1]
wird also in den Adressraum des Zielprozesses in einen Speicherbereich gleicher größe kopiert und der
cds.lpData
wird auf den neuen Speicherbereich umgelenkt (wobei lParam=&cds während der WM_COPYDATA wohl auch auf eine kopierte Struktur von cds zeigt, nehm' ich jetzt mal frech an)
Die Daten sind solange gültig, bis der Message-Handler (=die Window-Procedure) fertiggelaufen ist. D.h. wenn man die Daten später noch braucht, muss man sie im Message-Handler nochmal kopieren.
Jupp, alles klar.
Danke,
ciao.