Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Zeichenkette mit SendMessage verschicken und empfangen (https://www.delphipraxis.net/9427-zeichenkette-mit-sendmessage-verschicken-und-empfangen.html)

Luckie 26. Sep 2003 08:42


Zeichenkette mit SendMessage verschicken und empfangen
 
Also ich verschicke so:
Delphi-Quellcode:
SendMessage(hWnd, CEM_COPIEDFILE, MAKEWPARAM(Word(bSuccess), i), Integer(@SourceFilename[1]));
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?
Delphi-Quellcode:
procedure TForm1.Wndproc(var msg: TMessage);
var
  Filename: String;
begin
  case msg.Msg of
    CEM_COPIEDFILE:
      begin
        Filename := ???;
Die Adresse der Zeichenkette steht ja im lParam. Aber wie komme ich jetzt an den tatsächlichen Inhalt ran? :gruebel:

Immer diese Zeiger. Ich glaube, ich werde Metzger, dann kann ich wemfalls noch blöde TV Shows machen. :roll:

sakura 26. Sep 2003 08:49

Re: Zeichenkette mit SendMessage verschicken und empfangen
 
Wie wäre der Versuch:
Delphi-Quellcode:
FileName := String(PChar(Pointer(msg.lParam)));
:?:

...:cat:...

Basilikum 26. Sep 2003 09:28

Re: Zeichenkette mit SendMessage verschicken und empfangen
 
Delphi-Quellcode:
SendMessage(...,Integer(@SourceFilename));
und

Delphi-Quellcode:
Filename:=PString(Pointer(Msg.lParam))^;
(bei @SourceFilename[1] wird die Länge nicht mitgegeben)

Luckie 26. Sep 2003 09:30

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.

Motzi 26. Sep 2003 10:31

Re: Zeichenkette mit SendMessage verschicken und empfangen
 
Zitat:

Zitat von Basilikum
Delphi-Quellcode:
SendMessage(...,Integer(@SourceFilename));
und

Delphi-Quellcode:
Filename:=PString(Pointer(Msg.lParam))^;
(bei @SourceFilename[1] wird die Länge nicht mitgegeben)

Aber so verschickst du nur den "Pointer auf den Pointer", denn ein String ist (genauso wie ein PChar) nur ein Zeiger auf die Zeichenkette -> SizeOf(String) = 4! (zumindest unter normalen Einstellungen)

@Luckie: wieso? Pointer sind doch was herrliches!! ;)

Christian Seehase 26. Sep 2003 11:33

Re: Zeichenkette mit SendMessage verschicken und empfangen
 
Moin Basilikum,

Zitat:

Zitat von Basilikum
(bei @SourceFilename[1] wird die Länge nicht mitgegeben)

als Ergänzung zu Motzis Beitrag:
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.

OG Karotte 19. Feb 2006 13:14

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:

SendMessage(HWND_BROADCAST, WM_CMSMSG, 0, Integer(PChar(smsg)));
Und hier die Empfangsroutine: (zum Teil aus der JCL)

Delphi-Quellcode:
// 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;
Wo ist der Fehler???

Ich bin am verzweifeln...

Christian Seehase 19. Feb 2006 13:27

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 Hier im Forum suchenWM_COPYDATA an.

OG Karotte 19. Feb 2006 15:38

Re: Zeichenkette mit SendMessage verschicken und empfangen
 
Hallo Chris,
danke für die schnelle Antwort.
Ich werde es gleich mal ausprobieren...

Gruß
OG Karotte

Luckie 19. Feb 2006 20:45

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 MSDN-Library durchsuchenWM_COPYDATA, da sich dann Windows drumkümmert, dass der Zeiger gültig ist, in dem die Adresse in einen gemeinsamen Speicherbereich gemappt wird.

Ein Beispiel zu WM_COPYDATA gibt es hier: http://www.michael-puff.de/Developer..._COPYDATA.html Alternativ kann man eine Interprozesskommunikation auch mittels Memmory mapped files lösen: http://www.michael-puff.de/Developer...tiges/MMF.html oder über Pipes.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:06 Uhr.
Seite 1 von 2  1 2      

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