Einzelnen Beitrag anzeigen

gmc616

Registriert seit: 25. Jun 2004
Ort: Jena
627 Beiträge
 
Delphi 10.3 Rio
 
#1

Daten übertragen von DLL nach EXE

  Alt 24. Nov 2005, 15:31
Hallo DP'ler,

ich möchte Daten von einer DLL in die HostApplication senden.
Dafür nutze ich Code, den ich hier im Forum gefunden habe, aber leider noch nicht so recht verstehe.

Die Struktur die übertragen werden soll:
Delphi-Quellcode:
type
  PcsCopyDataStruct = ^TcsCopyDataStruct;
  TcsCopyDataStruct =
  packed record
    dwData : DWORD;
    cbData : DWORD;
    lpData : Pointer;
  end;
Die DLL sendet die Struktur so:
Delphi-Quellcode:
procedure fSendMsg(pHwnd : HWND); stdcall;
var
  dwMsg : DWORD;
  cdWork : TcsCopyDataStruct;
  sDummyStr : string;
begin
  dwMsg := RegisterWindowMessage('{6A64733D-6DAE-4972-9668-0181419AE58D}');
  sDummyStr := ('Delphi-Praxis ist super!');
  cdWork.dwData := dwMsg;
  cdWork.cbData := Length(sDummyStr)+1;
  cdWork.lpData := AllocMem(cdWork.cbData);
  try
    CopyMemory(cdWork.lpData,@sDummyStr[1],cdWork.cbData-1);
    sendMessage(pHwnd,WM_COPYDATA,dwMSg,lParam(@cdWork)); // [color=#ff0000]<- Stürtz ab[/color]
    //PostMessage(pHwnd,WM_COPYDATA,dwMSg,lParam(@cdWork)); // [color=#ff0000]<- Msg kommt nicht an[/color]
   finally
     FreeMem(cdWork.lpData,cdWork.cbData);
   end;
end;
und zum Empfangen in der Hostanwendung überscheibe die die WndProc so:
Delphi-Quellcode:
procedure TForm1.WndProc(var msg : TMessage);
var cdWork : PcsCopyDataStruct;
begin
  if msg.Msg = WM_COPYDATA then begin
    if msg.WParam = dwMsg then begin
      cdWork := PcsCopyDataStruct(msg.lParam);
      showMessage (pchar(cdWork.dwData));
    end else
      // Jede andere Message an die ursprüngliche Prozedure weiterreichen
      inherited WndProc(msg);

  end else
    // Jede andere Message an die ursprüngliche Prozedure weiterreichen
    inherited WndProc(msg);
end;
Aufgerufen wird das ganz so:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  dwMsg := RegisterWindowMessage('{6A64733D-6DAE-4972-9668-0181419AE58D}');
  fSendMsg(Form1.Handle);
end;
Das SendMessge in der DLL führt zu einer Schutzverletzung und PostMessage scheint garnicht erst anzukommen, aber wieso?
Ich nutze diese Code auch an anderer Stelle und dort funktioniert er.
Gibt es beim Senden aus DLL's noch etwas zu beachten?
Oder hab ich was übersehen?

Könnt ihr helfen?

Sicher hat es was mit geschützten Speicherbereichen zu tun.
Wäre net wenn ihr mir das erklären könntet.

Gruß und Danke
gmc
  Mit Zitat antworten Zitat