Entwickler-Ecke
Windows API - string in sendmessage, wie wieder auslesen?
Xion - Do 17.05.07 12:23
Titel: string in sendmessage, wie wieder auslesen?
Hi, ich schicke per
Delphi-Quelltext
1:
| SendMessage(H,WM_USER+3,Integer(Txt),0); |
einen String an ein andres Programm...wenn ich es in meinem andren programm aber dann mit
wieder auslesen will kommt nur buchstabensalat raus...wo is mein fehler?
Thx im vorraus
Moderiert von
Christian S.: Delphi-Tags hinzugefügtModeriert von
Christian S.: Topic aus VCL (Visual Component Library) verschoben am Do 17.05.2007 um 14:30
alzaimar - Do 17.05.07 12:41
Das geht so nicht: Denn das andere Programm hat ja gar keinen Zugriff auf den Adressraum des Senders.
VErwende die Message WM_COPYDATA. Damit geht das. Du musst dann noch so ein CopyDataStruct (oder wie das heißt) befüllen. Ist aber sehr einfach.
Xion - Do 17.05.07 13:20
ok, thx :)
hab nur das problem, dass WM_COPYDATA nicht ankommt...
Delphi-Quelltext
1: 2: 3: 4:
| cds.dwData:=0; cds.cbData:=sizeof(Txt); cds.lpData:=@Txt; SendMessage(H,WM_COPYDATA,Integer(@cds),0); |
Empfänger
Delphi-Quelltext
1:
| procedure WriteProtokoll(var msg: TMessage); message WM_COPYDATA; |
=>keine reaktion
mit WM_USER+4 gehts...
Xion - Do 17.05.07 13:23
aah, so empfängt er was:
SendMessage(H,WM_COPYDATA,HInstance,Integer(@cds));
kann mir jemand erklären warum? würds gerne verstehen und nicht nur abschreiben...
Xion - Do 17.05.07 13:29
und wie genau funktioniert das auslesen dann?
Delphi-Quelltext
1:
| String(msg.CopyDataStruct.lpData) |
geht nicht (Buchstabensalat)
Xion - Fr 18.05.07 12:56
habs jetzt so (kommt nur mist an)
Sender
1: 2: 3: 4: 5: 6: 7: 8:
| var h: THandle; cds: TCopyDataStruct; begin cds.dwData:=0; cds.cbData:=sizeof(Txt); cds.lpData:=@Txt; h:=FindWindow('TNynx2Form', nil); SendMessage(H,WM_COPYDATA,Longint(Application.Handle),Integer(@cds)); end; |
Empfänger
1: 2: 3: 4: 5:
| var sText: array[0..256] of Char; begin StrLCopy(sText, Msg.CopyDataStruct.lpData, Msg.CopyDataStruct.cbData); Memo.Lines.Add(sText); end; |
Xion - Fr 18.05.07 13:24
aah, jetzt gehts...jetzt ist mir auch klar, wies funktioniert ;)
Empfänger
1: 2: 3: 4: 5: 6: 7: 8:
| var h: THandle; cds: TCopyDataStruct; begin cds.dwData:=0; cds.cbData:=StrLen(PChar(Txt)) + 1;; cds.lpData:=PChar(Txt); h:=FindWindow('TNynx2Form', nil); SendMessage(H,WM_COPYDATA,Longint(Application.Handle),Integer(@cds)); end; |
alzaimar - Fr 18.05.07 13:28
Vielleicht liegt es daran, das Du die Adresse eines Strings übergibts. MyString ist ein Pointer und @MyString die Adresse diese Zeigers. @MyString[1] ist dagegen die Adresse des ersten Zeichens im String...
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| Procedure SendStringToWindow (aMessage : String; hClient : Integer); Var c: TCopyDataStruct;
Begin c.dwData := 0; c.cbData := Length(aMessage); c.lpData := @aMessage[1]; SendMessage(hClient, WM_COPYDATA, 0, Integer(@c)); End; |
Und so empfange ich das:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| Procedure TDispatcherWindow.CMCopyData(Var M: TMessage); Var P: PCopyDataStruct; sMessage : String; Begin p := PCopyDataStruct(M.LParam); SetLength(sMessage , p^.cbData); Move(PChar(p^.lpData)^, sMessage [1], p^.cbData); PendingJobs.AddJob(s); End; |
Xion - Fr 18.05.07 13:33
thx :D , habs ja eben grad gefunden, den fehler. Funtkioniert einwandfrei :)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!