2017-02-02 3 views
-1

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.

+0

Also dieser Code nicht relevant zu verwenden ist. Das Problem ist, dass keine Nachricht ankommt? –

+0

Korrigieren. Ich bin mir nicht sicher, warum der Code nicht relevant ist? Nachrichten kommen von anderen Anwendungen gut an. –

+0

Wir brauchen nicht das gesamte Muster. Können wir nicht einen MCVE haben? –

Antwort

0

Es funktioniert nicht für mich auf Windows 10 nur, wenn Receiver als Administrator ausgeführt wird. In diesem Fall benötigen Sie Folgendes, um es zuzulassen.

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); 

aktualisieren Eigentlich existiert diese Funktion erst seit Windows 7, Vista benötigen Sie ChangeWindowMessageFilter

Verwandte Themen