两个独立的delphi做的exe程序间如保传递参数我想做一个系统,里面的每个模块用一个独立exe程序来设现,但有一些公用变量,参数,如何在这些exe之间实现传递啊?

解决方案 »

  1.   

    1、如果是用A打开B,可以传递命令行参数,也可以用2的方法2、如果各自独立运行,运行期间传递数据,可以通过剪贴板,可以发消息,可以通过DLL......3、上述实现的具体演示代码,请根据上述提示,自己网上搜一哈
      

  2.   

    我来续楼上的吧
    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;
      

  3.   

    我来续楼上的吧
    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;
      

  4.   

    进程通信(自定义数据)unit Unit1;
    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"和"进程通信"
      

  5.   

    进程通讯(自定义消息)
    进程通讯(自定义消息)
    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.
      

  6.   

    大概说几种方法吧1.共享内存传递2.发送消息传递3.com接口,使用进程外服务器。具体的例子都可以找到。