两个独立Delphi执行程序之间怎样传递参数?(100分)

  • 主题发起人 主题发起人 zhym79
  • 开始时间 开始时间
Z

zhym79

Unregistered / Unconfirmed
GUEST, unregistred user!
两个独立Delphi执行程序之间怎样传递参数?
想把Exe1的参数(record)传给Exe2.
 
设一个INI文件,分别写入和读出指定参数信息。。。。
 
给对方的主窗体handle发送自定义消息
 
给对方的主窗体handle发送自定义消息
这位大哥还能给各sample啊?
 
使用内存映射文件可以使多个进程共享数据
 
1)WINDOWS API函数FindWindow,用于查找指定程序的主窗口HANDLE,
HWND FindWindow( LPCTSTR lpClassName, // pointer to class name
LPCTSTR lpWindowName // pointer to window name
);
第一个参数是对方窗体的类名如:TForm1;

2)发送消息用WINDOWS API函数SendMessage
LRESULT SendMessage( HWND hWnd, // handle of destination window
UINT Msg, // message to send
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
3)自定义消息
type
TForm1 = class(TForm)
private
{ Private declarations }
procedure WMXXXXX(var Message: TMessage); message WM_XXXXX;
public
{ Public declarations }
end;
 
同意orangutang, 使用消息传递很方便
 
同过一个Class封装内存影射是比较好的
 
两个程序之间用消息传递数据
两个程序之间用消息传递数据。
问题:我想用SendMessage和自定义消息在两个程序之间传递一个字符串,问题是如果这个字符串是一个常量,SendMessage(h,CM_MYMESSAGE,0,integer(pchar('abcdef')));另外一个程序对CM_MYMESSAGE进行处理可以收到'abcdef',然而,把abcdef变成一个pchar或者string进行传递,就无法正常使用了!如何解决呢?

解答:可以利用WM_COPYDATA来做。

下面代码仅仅演示,细节错误不予考虑

procedure Init;

var

s : pchar;

h : hwnd;

buf:tagCOPYDATASTRUCT;

begin

h := FindWindow('TForm1', 'Form1');

if h <> 0 then

begin

GetMem(s,100);

buf.lpData :=s;

buf.cbData:=100;

buf.dwData :=100;

strpcopy(s, ParamStr(0));

SendMessage(h, WM_COPYDATA, 0, integer(@buf));

end;

end;

procedure TForm1.WM_COPYDATA(var msg: TMessage);

var

P:^tagCOPYDATASTRUCT;

begin

p:=Pointer(Msg.lParam);

ShowMessage(strpas(p.lpData));

end;

***********************************************************************************

{

The WM_COPYDATA messages makes it possible to transfer information

between processes. It does this by passing the data through the kernel.

Space is allocated in the receiving process to hold the information that is copied,

by the kernel, from the source process to the target process.

The sender passes a pointer to a COPYDATASTRUCT, which is defined as a structure

of the following:

}

type

TCopyDataStruct = packed record

dwData: DWORD; // anwendungsspezifischer Wert

cbData: DWORD; // Byte-L?nge der zu übertragenden Daten

lpData: Pointer; // Adresse der Daten

end;

{ Sender Application }

unit SenderApp;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls, ExtCtrls;

type

TForm1 = class(TForm)

Button1: TButton;

Edit1: TEdit;

Button2: TButton;

Image1: TImage;

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

private

procedure SendCopyData(hTargetWnd: HWND; ACopyDataStruct:TCopyDataStruct);

public

end;

var

Form1: TForm1;

implementation

{$R *.DFM}

// Sender: Send data

// Sender: Daten schicken

procedure TForm1.SendCopyData(hTargetWnd: HWND; ACopyDataStruct:TCopyDataStruct);

begin

if hTargetWnd <> 0 then

SendMessage(hTargetWnd, WM_COPYDATA, Longint(Handle), Longint(@ACopyDataStruct))

else

ShowMessage('No Recipient found!');

end;

// Send Text from Edit1 to other app

// Text von Edit1 an andere Anwendung schicken

procedure TForm1.Button1Click(Sender: TObject);

var

MyCopyDataStruct: TCopyDataStruct;

hTargetWnd: HWND;

begin

// Set up a COPYDATASTRUCT structure for use with WM_COPYDATA

// TCopyDataStruct mit den Sende-Daten Infos ausfüllen

with MyCopyDataStruct do

begin

dwData := 0; // may use a value do identify content of message

cbData := StrLen(PChar(Edit1.Text)) + 1; //Need to transfer terminating #0 as well

lpData := PChar(Edit1.Text)

end;

// Find the destination window for the WM_COPYDATA message

// Empf?nger Fenster anhand des Titelzeilentextes suchen

hTargetWnd := FindWindow(nil,PChar('Message Receiver'));

// send the structure to the receiver

// Die Struktur an den Empf?nger schicken

SendCopyData(hTargetWnd, MyCopyDataStruct);

end;

// Send Image1 to other app

// Image1 an andere Anwendung schicken

procedure TForm1.Button2Click(Sender: TObject);

var

ms: TMemoryStream;

MyCopyDataStruct: TCopyDataStruct;

hTargetWnd: HWND;

begin

ms := TMemoryStream.Create;

try

image1.Picture.Bitmap.SaveToStream(ms);

with MyCopyDataStruct do

begin

dwData := 1;

cbData := ms.Size;

lpData := ms.Memory;

end;

// Search window by the window title

// Empf?nger Fenster anhand des Titelzeilentextes suchen

hTargetWnd := FindWindow(nil,PChar('Message Receiver'));

// Send the Data

// Daten Senden

SendCopyData(hTargetWnd,MyCopyDataStruct);

finally

ms.Free;

end;

end;

end.

{*********************************************************************}

{ Receiver Application }

unit ReceiverApp;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

ExtCtrls, StdCtrls;

type

TForm1 = class(TForm)

Image1: TImage;

Label1: TLabel;

private

procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA;

{ Private-Deklarationen }

public

{ Public-Deklarationen }

end;

var

Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.WMCopyData(var Msg: TWMCopyData);

var

sText: array[0..99] of Char;

ms: TMemoryStream;

begin

case Msg.CopyDataStruct.dwData of

0: { Receive Text, Text empfangen}

begin

StrLCopy(sText, Msg.CopyDataStruct.lpData, Msg.CopyDataStruct.cbData);

label1.Caption := sText;

end;

1: { Receive Image, Bild empfangen}

begin

ms := TMemoryStream.Create;

try

with Msg.CopyDataStruct^ do

ms.Write(lpdata^, cbdata);

ms.Position := 0;

image1.Picture.Bitmap.LoadFromStream(ms);

finally

ms.Free;

end;

end;

end;

end;

end.

 


 
WM_COPYDATA 只能用SendMessage,不能Post,这就意味着发送的一方必须等待接受方完成处理.而且其系统开销比较大.
 
后退
顶部