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