私は、デルファイアプリケーションを使用してメッセージを返信します。テストのために、私はdllが別のアプリケーションにメッセージを送信しているが、それらは表示されていません。Delphi DLLからアプリケーションへのメッセージの受け渡し
DLLコード
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;
レシーバコード
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は、DLLを呼び出すDelphiアプリケーションのハンドルを渡されます。
最後の2つの機能はまだ実装されていません。私は必要に応じてレシーバコードを投稿することができますが、それは送信者のために構築された他のデルファイアプリケーションとうまく動作しています。
関数自体がうまく呼び出されると、ShowMessage()関数は仕事を呼び出します。
私はSendMessageとRaiseLastErrorの戻りコードをチェックしており、どちらも成功を示しています。
これはUIPIと関係がありますが、両方のアプリケーションの「整合性」をProcessExplorerで確認していて、どちらもMediumに設定されていると感じました。
これはWindows Vistaにあります。
を使用する必要があるVistaの、Windows 7のため、存在しています。問題はメッセージが到着しないということですか? –
正しい。なぜコードが関係ないのか分かりません。メッセージは他のアプリケーションから正常に到着します。 –
すべての定型文は必要ありません。 MCVEはできませんか? –