2017-02-02 5 views
-1

私は、デルファイアプリケーションを使用してメッセージを返信します。テストのために、私は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にあります。

+0

を使用する必要があるVistaの、Windows 7のため、存在しています。問題はメッセージが到着しないということですか? –

+0

正しい。なぜコードが関係ないのか分かりません。メッセージは他のアプリケーションから正常に到着します。 –

+0

すべての定型文は必要ありません。 MCVEはできませんか? –

答えて

0

Receiverが管理者として実行されている場合のみ、Windows 10では動作しません。この場合、許可するには次のようにする必要があります。

type 
    TChangeFilterStruct = packed record 
    cbSize: DWORD; 
    ExtStatus: DWORD; 
    end; 
    PChangeFilterStruct = ^TChangeFilterStruct; 

const 
    MSGFLT_ALLOW = 1; 
    MSGFLT_DISALLOW = 2; 
    MSGFLT_RESET = 0; 

{$WARN SYMBOL_PLATFORM OFF} 
function ChangeWindowMessageFilterEx(Wnd: HWND; Message: UINT; Action: DWORD; 
    ChangeFilterStruct: PChangeFilterStruct): Bool; stdcall; external 'User32.dll' delayed; 
{$WARN SYMBOL_PLATFORM ON} 


    ChangeWindowMessageFilterEx(ReceiverWindowHandle, WM_COPYDATA, MSGFLT_ALLOW, nil); 

更新 実はこの機能は、だけなので、このコードは関係ありませんあなたは ChangeWindowMessageFilter

関連する問題