Hallo,
ausgehend von dem
Thread, wo ich aufgrund des nicht funktionierenden WM_COPYDATA auf die Named Pipes ausgewichen bin, welche dann auch nicht funktionierten. Nach einen Test von zwei normalen selbstgeschriebenen Windowsprogrammen, steht fest dass die verwendeten Funktionen für das Übertragen und Empfangen von WM_COPYDATA funktionieren.
Hier der Source von den beiden funktionierenden Programmen:
Delphi-Quellcode:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, uallProcess, StdCtrls;
type
TForm1 =
class(TForm)
btn1: TButton;
procedure btn1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
const
WM_COPYDATA = $004A;
type Tmydata =
packed record
datacount: integer;
ind: boolean;
end;
var mydata: TMyData;
CDS: TCopyDataStruct;
winh: integer;
procedure sendapp(len: integer; indata: boolean);
begin
mydata.datacount := len;
mydata.ind := indata;
SendMessageA(winh,WM_COPYDATA,0,cardinal(@CDS));
end;
procedure TForm1.btn1Click(Sender: TObject);
begin
winh := FindWindowA(
nil,'
ShowTraffic');
if winh <> 0
then sendapp(10,true);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
CDS.dwData := 0;
CDS.cbData := sizeof(TMyData);
CDS.lpData := @mydata;
end;
end.
Delphi-Quellcode:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm2 =
class(TForm)
mmo1: TMemo;
private
{ Private-Deklarationen }
procedure WMNOTIFYCD(
var Msg: TWMCopyData);
message WM_COPYDATA;
public
{ Public-Deklarationen }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
type Tmydata =
packed record
datacount: integer;
ind: boolean;
end;
var mydata: TMydata;
procedure TForm2.WMNOTIFYCD(
var Msg: TWMCopyData);
var exeanz:
string;
begin
if Msg.CopyDataStruct^.cbData = sizeof(TMydata)
then
begin
CopyMemory(@myData,Msg.CopyDataStruct^.lpData,sizeof(TMyData));
mmo1.Lines.Add(IntToStr(mydata.datacount))
end;
end;
end.
Genau die gleichen Funktionen werden in einer injezierten
DLL verwendet um WM_COPYDATA an ein Programm zu schicken. Die Funktion in der auch SendMessageA ausgelöst wird, wird ausgeführt (getestet mit einer Messagebox), aber es kommen im Hauptprogramm keine Daten an - die procedure WMNOTIFYCD(var Msg: TWMCopyData); message WM_COPYDATA; wird nie ausgelöst, wenn WM_COPYDATA von der injezierten
DLL aus geschickt wird. Das ganze Messaging basiert zu großen Teilen auf dem TrafficCounter Beispiel der uallCollection. Dieses Beispiel funktioniert bei mir auch nicht, also es kommen keine Daten an (Vista 32bit).
Woran kann das liegen?
Gruss