WM_COPYDATA vs. eigene Message
-
Hi!
1.) Macht es eigentlich einen Unterschied ob zwei Anwendungen über WM_COPYDATA und COPYDATASTRUCT kommnunizieren oder ob ich eigene Nachricht mit eigenen Daten als lParam versende?
Vorraussetzung ist natürlich, dass beide Anwendungen das Format vom lParam Parameter kennen.2.) Warum haben einige API-Structs einen cbSize Member, der mit
sizeof(STRUCT)initialisiert werden muss? Wie nutzt Windows das intern?Chris
-
Zu 1:
Das hängt davon ab, welche und wieviele Informationen zwischen zwei Anwendungen ausgetauscht werden müssen.
Eine neue selbstdefinierte Nachricht kann leicht mit RegisterWindowMessage() erstellt werden.Zu 2:
Mit Hilfe dieses Members kann Windows erkennen, mit welchem Stand der Strukturdefinition die Applikation arbeitet.
Beispiel Tooltip: Bis Windows 2000 kann das System nur Strukturen mit sizeof(TOOLINFO) mit Wert 44 Bytes verarbeiten, ab Windows XP kann es dagegen auch Strukturen mit Wert 48 Bytes verarbeiten.HTH,
Martin
-
Mmacher schrieb:
Zu 1:
Das hängt davon ab, welche und wieviele Informationen zwischen zwei Anwendungen ausgetauscht werden müssen.
Eine neue selbstdefinierte Nachricht kann leicht mit RegisterWindowMessage() erstellt werden.Ich hatte eigentlich auch eine "eigene Fensternachricht" vom Typ
#define WM_MYCOPYDATA (WM_USER + 1)gedacht.Mmacher schrieb:
Zu 2:
Mit Hilfe dieses Members kann Windows erkennen, mit welchem Stand der Strukturdefinition die Applikation arbeitet.
Beispiel Tooltip: Bis Windows 2000 kann das System nur Strukturen mit sizeof(TOOLINFO) mit Wert 44 Bytes verarbeiten, ab Windows XP kann es dagegen auch Strukturen mit Wert 48 Bytes verarbeiten.Ok, das war meine Vermutung.

Chris
-
Chris2 schrieb:
Ich hatte eigentlich auch eine "eigene Fensternachricht" vom Typ
#define WM_MYCOPYDATA (WM_USER + 1)gedacht.Mit RegisterWindowMessage bin aber wohl auf der sichereren Seite. Danke.
Chris
-
Wenn du nicht mehr als 2 DWORDs als Daten versenden musst, dann geht eine eigene Message.
Wenn du grössere Blöcke versenden willst, dann musst du WM_COPYDATA nehmen, da Windows ja nicht wissen kann wie LPARAM und WPARAM bei selbst definierten Messages zu verstehen sind. Also dass LPARAM z.B. auf irgendeine Struktur zeigt, in der dann wiederum irgend ein Zeiger auf "deine" Daten zeigt, deren Grösse etc.
Mit WM_COPYDATA kannst du dagegen auch ein paar Kilobyte an Daten austauschen, da Windows WM_COPYDATA/COPYDATASTRUCT kennt, und daher weiss wie das alles zu verstehen ist.
-
hustbaer schrieb:
Wenn du grössere Blöcke versenden willst, dann musst du WM_COPYDATA nehmen, da Windows ja nicht wissen kann wie LPARAM und WPARAM bei selbst definierten Messages zu verstehen sind. Also dass LPARAM z.B. auf irgendeine Struktur zeigt, in der dann wiederum irgend ein Zeiger auf "deine" Daten zeigt, deren Grösse etc.
Warum muss Windows wissen wieviel Daten ich versende? Wird der Wert von LPARAM nicht einfach an das Zielfenster weitergereicht und ist somit egal ob dahinter sich ein Zeiger auf eine belibieg große Struktur verbirgt? Oder greift die Zielanwendung intern auf den Speicherbereich von der Quellanwendung zu?
Chris
-
Chris2 schrieb:
Wird der Wert von LPARAM nicht einfach an das Zielfenster weitergereicht und ist somit egal ob dahinter sich ein Zeiger auf eine belibieg große Struktur verbirgt?
Eine andere Applikation (also windows-intern somit ein anderer Prozeß) hat einen eigenen Adreßraum, da Windows jedem gestarteten Prozeß jeweils einen eigenen virtuellen Adreßraum einrichtet.
D.h. ein gewöhnlicher Pointer im virtuellen Adreßraum einer Applikation ist nutzlos im virtuellen Adreßraum bei einer anderen Applikation!
HTH,
Martin
-
Mit eigenen Nachrichten kann man keine Zeiger auf Daten austauschen, da die Zieger nur im eigenen Prozess gültig sind. Mittels WM_COPYDATA sorgt Windows dafür, dass die Zeiger auch im anderen Prozess gültig sind.
-
Eine Frage habe ich wg. WM_COPYDATA. In der MSDN steht
The data being passed must not contain pointers or other references to objects not accessible to the application receiving the data.
Darf ich denn eine Struktur wie folgt verwenden?
struct MyData { CString szText1; // ist ja intern ein Zeiger CString szText2; // -"- int Counter; std::vector<long> Values; };Hier kommen ja auch intern Zeiger vor oder ist das egal?
Chris
-
darfst du doppelt nicht, weil a) intern zeiger und b) sind weder CString noch std::vector PODs, d.h. sie dürfen nicht mit memcpy o.ä. funktionen kopiert werden.
und WM_COPYDATA verhält sich diesbezüglich wie memcpy.
-
hustbaer schrieb:
darfst du doppelt nicht, weil a) intern zeiger und b) sind weder CString noch std::vector PODs, d.h. sie dürfen nicht mit memcpy o.ä. funktionen kopiert werden.
und WM_COPYDATA verhält sich diesbezüglich wie memcpy.Hmm, also ist WM_COPYDATA wirklich dazu da, um Daten "fester Größe" mal eben an einen andere App zu schicken.
Wie könnte ich denn dynamische Daten (also PODs) zwischen Anwendungen austauschen?
Chris
-
- TCP/IP
- Shared Memory
- Pipes
- Mail Slots
- ...Suche nach Inter Process Communication
IPC...
-
Chris2 schrieb:
dynamische Daten (also PODs)
Lernen, lernen, popernen.