两个独立的delphi做的exe程序间如保传递参数我想做一个系统,里面的每个模块用一个独立exe程序来设现,但有一些公用变量,参数,如何在这些exe之间实现传递啊?
解决方案 »
- cannot find implementation of method formActive
- 麻烦各位给小弟看看这行代码,就一行哈!小弟先谢过了!
- 如何在listbox中显示数据表的行???
- 请教高手关于多层结构的问题
- delphi动态调用dll,在线等(送100分)
- 基類問題怎麽解決?在線等!!!!!
- 这样行吗?一个C/S程序只用一个QUERY和一个DataSource和一个ADOConnect可以吗?
- sqlserver2000在winXP下的还原问题.
- Kingron:我给你发的妹儿你收到了吗?
- 如何用Ado连接加了密码的ACCESS2000数据库?
- 关于Pos与繁体中文的问题。
- cxgrid控件显示居中问题
1、参数传递法(uses ShellApi)
A中使用ShellExecute(0, 'Open', 'X:\B.exe', '参数1 参数2 参数3', nil, SW_SHOWNORMAL);启动B
B中使用ParamStr(1)可以得到字符串'参数1',使用ParamStr(2)可以得到字符串'参数2'...2、运行期传递
A中
var
Str: string;
Data: TCopyDataStruct;
begin
Str := '参数1';
Data.dwData := 0//如果只要传个数值,用它就够了
Data.cbData := Length(Str) + 1;//如果传复杂数据,这个是指定数据区大小
Data.lpData := PChar(Str);//如果传复杂数据,这个是指定数据区指针
SendMessage(hWnd, WM_COPYDATA, 0, Integer(@Data));//hWnd为B中某个窗体的Handle(怎么获取要看你的程序要求)
end;
B中
针对hWnd指定的窗体增加消息处理函数
procedure WMCopyData(var Message: TMessage); message WM_COPYDATA;
procedure T***.WMCopyData(var Message: TMessage);
var
pData: PCopyDataStruct;
begin
pData := PCopyDataStruct(Message.LParam);
pData^.dwData//是0
pData^.cbData//是字符串长度+1
pData^.lpData//是字符串的指针
end;
1、参数传递法(uses ShellApi)
A中使用ShellExecute(0, 'Open', 'X:\B.exe', '参数1 参数2 参数3', nil, SW_SHOWNORMAL);启动B
B中使用ParamStr(1)可以得到字符串'参数1',使用ParamStr(2)可以得到字符串'参数2'...2、运行期传递
A中
var
Str: string;
Data: TCopyDataStruct;
begin
Str := '参数1';
Data.dwData := 0//如果只要传个数值,用它就够了
Data.cbData := Length(Str) + 1;//如果传复杂数据,这个是指定数据区大小
Data.lpData := PChar(Str);//如果传复杂数据,这个是指定数据区指针
SendMessage(hWnd, WM_COPYDATA, 0, Integer(@Data));//hWnd为B中某个窗体的Handle(怎么获取要看你的程序要求)
end;
B中
针对hWnd指定的窗体增加消息处理函数
procedure WMCopyData(var Message: TMessage); message WM_COPYDATA;
procedure T***.WMCopyData(var Message: TMessage);
var
pData: PCopyDataStruct;
begin
pData := PCopyDataStruct(Message.LParam);
pData^.dwData//是0
pData^.cbData//是字符串长度+1
pData^.lpData//是字符串的指针
end;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
Const WM_COMM = WM_APP+100;
type
TForm1 = class(TForm)
Button1: TButton;
ListBox1: TListBox;
Button2: TButton;
Button3: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
procedure GetUsername(var msg:TWmCopyData); message WM_COPYDATA;
procedure ReturnResult(var msg:TMessage); message WM_COMM;
public
{ Public declarations }
end;
function EnumWndProc(AWnd:HWND;AlParam:LPARAM):Boolean;stdcall;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
ListBox1.Clear;
EnumWindows(@EnumWndProc,0);//枚举窗体,发送消息
end;
function EnumWndProc(AWnd:HWND;AlParam:LPARAM):Boolean;stdcall;
var
WndCaption: array[0..254] of Char;
ds: TCopyDataStruct;
begin
GetWindowText(AWnd, @WndCaption, 254);
if WndCaption[0]<>chr(0) then
Form1.ListBox1.Items.Add(Format('%d=%s',[AWnd,StrPas(WndCaption)]));
if WndCaption='彭轩' then
begin
ds.cbData := Length (Form1.Edit1.Text) + 1;
GetMem (ds.lpData, ds.cbData ); //为传递的数据区分配内存
StrCopy (ds.lpData, PChar (Form1.Edit1.Text));
SendMessage(AWnd,WM_COPYDATA,Form1.Handle,Cardinal(@ds));
end;
Result := True;
end;
procedure TForm1.ReturnResult(var msg: TMessage);
begin
if msg.WParam=1 then
ShowMessage('返回');
end;
procedure TForm1.GetUsername(var msg: TWmCopyData);
begin
//接收其它进程发来的消息,并判断消息来源不是自己本身
//取出消息携带的数据与Edit1.Text比较
if msg.From<>Form1.Handle then
begin
if Edit1.Text=StrPas(msg.CopyDataStruct^.lpData) then
SendMessage(msg.From,WM_COMM,1,0);
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
ListBox1.Clear;
EnumWindows(@EnumWndProc,0);
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Edit1.Text:='aaa';
end;
end.
注意 EnumWindows(@EnumWndProc,0);//枚举窗体,发送消息
在枚举窗体时,会认为同一个程序的窗口和工程是两个窗体,比如一个工程中
Form1.Caption:='进程通信2';
Application.Title:='进程通信';
这里会找到两个窗体 "进程通信2"和"进程通信"
进程通讯(自定义消息)
SenderMain.pas
unit SenderMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
Const WM_COMM = WM_APP+100;
Const str='Receiver';
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
function ShowProcess(Whandle: HWND):boolean ;
var
Form1: TForm1;
implementation
{$R *.dfm}
function ShowProcess(Whandle: HWND):boolean ;
begin
ShowWindow(Whandle,SW_restore);
SetForegroundWindow(Whandle);
SetActiveWindow(Whandle);
result :=true;
end;procedure TForm1.Button1Click(Sender: TObject);
var
whd : HWND;
begin
whd:=FindWindow(nil,pchar(str));
ShowProcess(whd);
SendMessage(whd,WM_COMM,0,0);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
whd : HWND;
begin
whd:=FindWindow(nil,pchar(str));
ShowProcess(whd);
SendMessage(whd,WM_COMM,0,1);
end;
procedure TForm1.Button3Click(Sender: TObject);
var
whd : HWND;
begin
whd:=FindWindow(nil,pchar(str));
ShowProcess(whd);
SendMessage(whd,WM_COMM,1,0);
end;
end.
receivemain.pasunit receivemain;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
Const WM_COMM = WM_APP+100;
type
TForm1 = class(TForm)
Edit1: TEdit;
private
{ Private declarations }
procedure userpro(var msg:TMessage); message WM_COMM;
public
{ Public declarations }
end;var
Form1: TForm1;implementation//uses receivemain;{$R *.dfm}
procedure TForm1.userpro(var msg:TMessage);
begin
if(msg.WParam=0)and(msg.LParam=0)then
Edit1.Text:='命令一 ';
if(msg.WParam=0)and(msg.LParam=1)then
Edit1.Text:='命令二 ';
if(msg.WParam=1)and(msg.LParam=0)then
Edit1.Text:='命令三 ';
end;end.