Delphi exe文件之间参数传递(续)

来源:互联网 发布:软件销售是卖软件吗 编辑:程序博客网 时间:2024/05/19 10:55

 上次只是研究了一个exe启动另一个exe的情况,这次研究了两个exe同时运行的情况。

{Delphi 2007}

{Project1.exe Unit1.pas}

const
  UM_MESSAGE_COMMUNICATE = WM_USER + 100;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  cDataParam: TCopyDataStruct;
  msg: string;
  hApp: HWND;
begin
  hApp := FindWindow('TForm2', nil);
  msg := 'Hello World';
  if hApp <> 0 then
  begin
    cDataParam.dwData := UM_MESSAGE_COMMUNICATE;
    cDataParam.cbData := length(msg)* sizeof(char) + 1;
    cDataParam.lpData := @msg[1];
    SendMessage(hApp, WM_COPYDATA, 0, LPARAM(@cDataParam));
  end;
end;

 

{Project2.exe Unit2.pas}

const
  UM_MESSAGE_COMMUNICATE = WM_USER + 100; 

type
  TForm2 = class(TForm)
    Edit1: TEdit;
  private
    { Private declarations }
  public
    { Public declarations }
    procedure WMCopyData(var msg: TWMCopyData); message WM_COPYDATA;
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

{ TForm2 }

procedure TForm2.WMCopyData(var msg: TWMCopyData);
begin
  if msg.CopyDataStruct^.dwData = UM_MESSAGE_COMMUNICATE then
  begin
    Edit1.Text := string(msg.CopyDataStruct^.lpData);
  end;
end;

 

在2009下应该也可以运行,cDataParam.cbData := length(msg)* sizeof(char) + 1;这个是出现乱码的关键地方,2009下char的大小为2

 

 

 

补充说明:

在Delphi2010中测试了一下WM_COPYDATA传送数据,给cDataParam.cbData赋值时,最后不是+1最好还是加个sizeof(char);

另外在接收数据时,msg.CopyDataStruct^.lpData直接强制转换成string类型,会报错,这里可以转换成Pchar赋值,即:

Edit1.Text := PChar(msg.CopyDataStruct^.lpData);

原创粉丝点击