![]() |
Re: Programm über SendMessage kontrollieren
Über Messages geht es so einfach nicht.
Vielleicht ist ein anderes Konzept für dich günstiger. Ich kenn aber dein Programm nicht. Hier erstmal die Lösung für Messages: Du kannts immer nur 32bit-Werte senden. Da passt selten ein ganzer Text rein. Allerdings passt da ein Pointer rein. Das ist dann Variante 1. Du schickst von Programm A einen Pointer an Programm B rüber, der sagt wo der String liegt und in Programm B kannst du dann die Zeichenkette über "readprocessmemory aus Programm A" auslesen. Da musst au Allerdings sicher stellen, dass Programm A den String solange bereit hält, bis B ihn ausgelesen hat. Variante 2 ist über ein globales Atom. Da kannst du global einen string hinterlegen und der ist mit seiner Nummer von jedem Programm aus lesbar und die Nummer schickst du über Messages. Das erstmal kurz dazu. Wenn du viel Text (also immer wieder Text) schicken willst, solltest du vielleicht mal über andere Möglichekiten (Pipes z.B.) nachdenken. |
Re: Programm über SendMessage kontrollieren
oder einfach ein wm_copydata
|
Re: Programm über SendMessage kontrollieren
Zitat:
|
Re: Programm über SendMessage kontrollieren
Hi,
vielen dank für eure beiträge. die wm_copydata variante gefällt mir sehr gut. hab mich auch schon auf der ms seite informiert, jedoch werde ich daraus nicht so schlau. wie könnte das denn in delphi aussehen ? vielen dank |
Re: Programm über SendMessage kontrollieren
Ich würde es spontan so sagen (ungetestet):
Delphi-Quellcode:
procedure sending(text:string);
var data:TCopyDataStruct; begin data.dwdata:=0; data.cbdata:=length(text); data.lpdata:=@text[1] sendmessage(zielhandle,wm_copydata,selfhandle,integer(@data)); end;
Delphi-Quellcode:
Edit: Wenn ich mir das so ansehe, finde ich es nicht einfacher als Atoms :gruebel:
type xxx=class(TForm)
... procedure receiving(var msg:TWMCopydata):message wm_copydata; ... end; ... procedure receiving(var msg:TWmcopydata); begin //Message in msg.copydatastruct end; Edit2: 1 Fehler behoben |
Re: Programm über SendMessage kontrollieren
@sirius:
wie würde denn die Atoms Variante aussehen, noch nie gehört *g* ? |
Re: Programm über SendMessage kontrollieren
Delphi-Quellcode:
Das "+10" kann auch anders sein, Hauptsache ist, du hast in beiden Programmen dieselbe Nummer und sie ist nicht kleiner als WM_User
procedure send(s:string);
var wparam,lparam:integer; begin wparam:=globaladdAtom(pchar(s)); lparam:=length(s); sendmessage(zielhandle,WM_User+10,wparam,lparam); globaldeleteatom(wparam); end;
Delphi-Quellcode:
type xxx=class(Tform)
... procedure receive(var msg:TMessage);message wm_user+10; end; procedure xxx.receive(var msg:TMessage); var s:string; begin setlength(s,msg.lparam); globalgetatomname(msg.wparam,@s,msg.lparam); //könnte auch @s[1] sein oder so... //s im Prog weiterleiten end; |
Re: Programm über SendMessage kontrollieren
Hi,
klappt soweit schon fast wunderbar... mein Programm empfängt die Nachricht, aber hier
Delphi-Quellcode:
scheint noch ein fehler zu sein, es gibt immer ne fehlermeldung ??
setlength(s,msg.lparam);
globalgetatomname(msg.wparam,@s,msg.lparam); //könnte auch @s[1] sein oder so... |
Re: Programm über SendMessage kontrollieren
Dann nimm mal statt @s, @s[1]
|
Re: Programm über SendMessage kontrollieren
Ok klappt wunderbar! Danke
aber sehe ich das richtig, dass ich jetzt jedes empfangene Zeichen in s[i] wieder zusammensetzen muss ? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:05 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz