![]() |
Zeichenkette mit SendMessage verschicken und empfangen
Also ich verschicke so:
Delphi-Quellcode:
den Zeiger auf eine Speicheradresse an der eine Zeichenkette steht. Das ganze geschieht aus einer Prozedur meines Prozesses. Wer mit denkt, weiß bestimmt, was jetzt kommt. :mrgreen: Wie empfange ich das jetzt wieder?
SendMessage(hWnd, CEM_COPIEDFILE, MAKEWPARAM(Word(bSuccess), i), Integer(@SourceFilename[1]));
Delphi-Quellcode:
Die Adresse der Zeichenkette steht ja im lParam. Aber wie komme ich jetzt an den tatsächlichen Inhalt ran? :gruebel:
procedure TForm1.Wndproc(var msg: TMessage);
var Filename: String; begin case msg.Msg of CEM_COPIEDFILE: begin Filename := ???; Immer diese Zeiger. Ich glaube, ich werde Metzger, dann kann ich wemfalls noch blöde TV Shows machen. :roll: |
Re: Zeichenkette mit SendMessage verschicken und empfangen
Wie wäre der Versuch:
Delphi-Quellcode:
:?:
FileName := String(PChar(Pointer(msg.lParam)));
...:cat:... |
Re: Zeichenkette mit SendMessage verschicken und empfangen
Delphi-Quellcode:
und
SendMessage(...,Integer(@SourceFilename));
Delphi-Quellcode:
(bei @SourceFilename[1] wird die Länge nicht mitgegeben)
Filename:=PString(Pointer(Msg.lParam))^;
|
Re: Zeichenkette mit SendMessage verschicken und empfangen
So verschicken:
Delphi-Quellcode:
.
SendMessage(hWnd, CEM_COPIEDFILE, MAKEWPARAM(Word(bSuccess), i), Integer(PChar(SourceFilename)));
Und wie sakura gezeigt hat, empfangen. |
Re: Zeichenkette mit SendMessage verschicken und empfangen
Zitat:
@Luckie: wieso? Pointer sind doch was herrliches!! ;) |
Re: Zeichenkette mit SendMessage verschicken und empfangen
Moin Basilikum,
Zitat:
Wenn Du z.B. @SourceFilename[3] nehmen würdest, würde die Adresse des 3. Zeichens der Zeichenkette übergeben werden. Die Angabe [1] wirst Du öfter brauchen, z.B. wenn Du einen String als Buffer für TFileStream verwendest. Die Länge braucht man übrigens nicht mitzugeben, da Delphi HugeStrings intern immer nullterminiert, so dass "normale" Funktionen ein definiertes Stringende finden, wenn sie auf einen PChar treffen. |
Re: Zeichenkette mit SendMessage verschicken und empfangen
Endlich, nach stundenlangem suchen bin ich hier gelandet:
Die Lösung meiner Probleme !!! Doch, oh Schreck, das einzige was ich bekomme ist ein AccessViolation Error!!!! Also, ich habe ebenfalls nach einer Möglichkeit gesucht den mittels LParam übergebenen Zeiger auf eine Stringvariable in einer anderen Anwendung auszulesen. Ich dachte hier wäre die Lösung meines Problems, aber welche der Lösungen ich auch verwende: Entweder kommt es zum o.g. Fehler oder es steht nur "Müll" in der Variablen. Sind die hier dargestellten Lösungen vielleicht doch nicht ganz richtig? Oder mache ich irgendwo einen Fehler? Hier der verwendete Code zum Senden:
Delphi-Quellcode:
Und hier die Empfangsroutine: (zum Teil aus der JCL)SendMessage(HWND_BROADCAST, WM_CMSMSG, 0, Integer(PChar(smsg)));
Delphi-Quellcode:
Wo ist der Fehler???
// JclAppInst Demo
procedure TfrmMain.WndProc(var Msg: TMessage); begin // Interprocess communication handler. // First check whether we can safely read TForm.Handle property ... if HandleAllocated and not (csDestroying in ComponentState) then if msg.msg = WM_CMSMSG then begin memProtokoll.Lines.add(String(PChar(Pointer(msg.lParam))); end else inherited else inherited; end; Ich bin am verzweifeln... |
Re: Zeichenkette mit SendMessage verschicken und empfangen
Moin Karotte,
erst einmal herzlich Willkommen hier in der Delphi-PRAXiS. Der Fehler liegt darin, dass die Adresse nicht prozessübergreifend gültig ist. Schau Dir doch, z.B., mal ![]() |
Re: Zeichenkette mit SendMessage verschicken und empfangen
Hallo Chris,
danke für die schnelle Antwort. Ich werde es gleich mal ausprobieren... Gruß OG Karotte |
Re: Zeichenkette mit SendMessage verschicken und empfangen
Der Unterschied ist: Ich habe die Nchricht nur uinnerhalb meines Prozesses verschickt und somit war die Adresse auch gültig. Du versuchst aber prozessbergreifend die Nachrciht zu verschicken. Und wie XChristian schon agt, geht das nur mit
![]() Ein Beispiel zu WM_COPYDATA gibt es hier: ![]() ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:06 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