Ich habe eine Delphi-Anwendung, die eine Delphi-DLL lädt, die Nachrichten zurück zu ihm sendet. Zum Testen habe ich die DLL, die eine Nachricht an eine andere Anwendung sendet, aber sie wird nicht angezeigt.Übergeben von Nachrichten von Delphi DLL zu Anwendung
dll Code
type
TSampleRecord = packed record
card : string[50];
end;
var
handle: HWND;
procedure PrepareDLL(AppHandle : HWND); stdcall;
begin
handle := AppHandle;
end;
procedure ConfigccDLL(Variables: PChar); stdcall;
var
sampleRecord: TSampleRecord;
copyDataStruct: TCopyDataStruct;
receiverHandle: HWND;
begin
sampleRecord.card := 'FakeCard';
copyDataStruct.dwData := Integer(2);
copyDataStruct.cbData := SizeOf(sampleRecord);
copyDataStruct.lpData := @sampleRecord;
receiverHandle := FindWindow(PChar('TReceiverMainForm'),PChar('ReceiverMainForm'));
SendMessage(receiverHandle, WM_COPYDATA, Integer(Handle), Integer(@copyDataStruct));
end;
Code Empfänger
type
TSampleRecord = packed record
card : string[50];
end;
TReceiverMainForm = class(TForm)
cdMemo: TMemo;
procedure FormCreate(Sender: TObject);
private
procedure WMCopyData(var Msg : TWMCopyData); message WM_COPYDATA;
procedure HandleCopyDataRecord(copyDataStruct : PCopyDataStruct);
end;
var
ReceiverMainForm: TReceiverMainForm;
implementation
procedure TReceiverMainForm.FormCreate(Sender: TObject);
begin
cdMemo.Clear;
end;
procedure TReceiverMainForm.HandleCopyDataRecord(
copyDataStruct: PCopyDataStruct);
var
CodeRcvd: string;
sampleRecord : TSampleRecord;
begin
sampleRecord.card := TSampleRecord(CopyDataStruct.lpData^).card;
CodeRcvd := '$B';
cdMemo.Lines.Add(Format('Received record at %s',[DateToStr(Now)]));
cdMemo.Lines.Add(CodeRcvd);
cdMemo.Lines.Add(Format('sampleRecord.card = %s',[sampleRecord.card]));
cdMemo.Lines.Add(Format('sampleRecord size: %d %d',[SizeOf(sampleRecord), copyDataStruct.cbData]));
end;
procedure TReceiverMainForm.WMCopyData(var Msg: TWMCopyData);
begin
cdMemo.Lines.Add(Format('WM_CopyData from: %d',[msg.From]));
HandleCopyDataRecord(Msg.CopyDataStruct);
msg.Result := cdMemo.Lines.Count;
end;
end.
PrepareDLL den Griff der delphi Anwendung übergeben wird, die die DLL aufruft.
Die letzten beiden Funktionen sind noch nicht implementiert. Ich kann den Empfängercode bei Bedarf posten, aber es funktioniert gut mit anderen Delphi-Anwendungen, die als Absender erstellt wurden.
Die Funktionen selbst werden in Ordnung aufgerufen, die Funktionsaufrufe von ShowMessage() funktionieren.
Ich habe den Rückgabecode von SendMessage und RaiseLastError überprüft und beide haben Erfolg.
Ich habe das Gefühl, das könnte mit UIPI zu tun haben, aber ich habe die "Integrität" beider Anwendungen mit ProcessExplorer überprüft und beide sind auf Mittel eingestellt.
Dies ist unter Windows Vista.
Also dieser Code nicht relevant zu verwenden ist. Das Problem ist, dass keine Nachricht ankommt? –
Korrigieren. Ich bin mir nicht sicher, warum der Code nicht relevant ist? Nachrichten kommen von anderen Anwendungen gut an. –
Wir brauchen nicht das gesamte Muster. Können wir nicht einen MCVE haben? –