DELPHI实现程序间的数据传递

时间:2010-01-26 14:50:11  来源:第二电脑网  作者:第二电脑网

  第二电脑网导读:、动态数据交换以及OLE自动化,但有条件限制并且相对较复杂。这里,我介绍三种有效的底层技术,希望对编程爱好者有所帮助。 利用WM_COPYDATA消息   使用该消息涉及一个TcopyDataStruct结构类型的指针。该结构中有三个成员: dwData 是一个32位的附加参数 cbData 表示要传递的数据区的大小 lpData 表示要传递的数据区的指针 下面举个例子。该例子由...
  正文:

在实际应用中,我们经常需要多个程序相互配合来完成某些特定功能。例如两个应用程序间的同步、互斥;应用程序在起第二份实例时的参数自动传递…。要实现这些功能,就必须能实现程序间的数据传递。
有些特殊的高级技术可在不同的程序间传递数据,如剪贴板、动态数据交换以及OLE自动化,但有条件限制并且相对较复杂。这里,我介绍三种有效的底层技术,希望对编程爱好者有所帮助。
利用WM_COPYDATA消息
 
使用该消息涉及一个TcopyDataStruct结构类型的指针。该结构中有三个成员:
dwData 是一个32位的附加参数
cbData 表示要传递的数据区的大小
lpData 表示要传递的数据区的指针
下面举个例子。该例子由两个程序构成,分别为SendData和GetData。
SendData程序向GetData程序发送消息,并传递edit1中的字符串;GetData在收到消息后,把SendData发送的字符串接受下来,并显示在相应的edit1中。
SendData程序:
……


var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
ds: TCopyDataStruct;
hd: THandle;
begin
  ds.cbData := Length (Edit1.Text) + 1;
  GetMem (ds.lpData, ds.cbData ); //为传递的数据区分配内存
StrCopy (ds.lpData, PChar (Edit1.Text));
  Hd := FindWindow (nil, 'Form2'); // 获得接受窗口的句柄
if Hd <> 0 then
  SendMessage (Hd, WM_COPYDATA, Handle,
  Cardinal(@ds)) // 发送WM_COPYDATA消息
else
  ShowMessage ('目标窗口没找到!');
  FreeMem (ds.lpData); //释放资源
end;
GetData程序:
 
TForm2 = class(TForm)
Edit1: TEdit;
private
{ Private declarations }
public
procedure Mymessage(var t:TWmCopyData);message WM_COPYDATA;
{ Public declarations }
end;
var
Form2: TForm2;
implementation
procedure TForm2.Mymessage(var t:TWmCopyData);
begin
  Edit1.text:=StrPas(t.CopyDataStruct^.lpData);//接受数据并显示。
end;

使用这种方法是WIN32应用程序进行交互的最简单的方法。
使用全局原子
Win32系统中,为了实现信息共享,系统维护了一张全局原子表。每个原子中存放了一些共享数据。关于对原子的操作,有一组专门的API函数:
GlobalAddAtom 在表中增加全局原子
GlobalDeleteAtom 在表中删除全局原子
GlobalFindAtom 在表中搜索全局原子
GlobalGetAtomName 从表中获取全局原子
笔者用这种方法实现了避免程序二次启动,但把第二次启动所带的参数传到第一个实例中以进行相应的处理的程序。基础处理如下:
在工程文件中:


program Pvdde;
uses
Forms,shellapi,Windows,dialogs,dde in 'dde.pas' {Form1};
{$R *.RES}
begin
  if GlobalFindAtom(PChar('PDDE_IS_RUNNING')) = 0 then
  //避免二次启动
begin
    K:=GlobalAddAtom(PChar('PDDE_IS_RUNNING'));
    Application.Initialize;
    Application.CreateForm(TForm1, Form1);
    Application.Run;
  end
  else
  begin
    //传递二次启动时的参数到第一个实例
H := FindWindow(PChar('TForm1'), PChar('资料保密严禁外传'));
    if ParamCount > 0 then
    begin
      L := GlobalAddAtom(PChar(ParamStr(1)));
      if H<>0 then
      SendMessage(H, WM_MYMESSAGE, 0, L);
      { 传递原子句柄 }
"DELPHI实现程序间的数据传递"由第二电脑网原创提供,转载请注明:http://www.002pc.com/master/College/Language/Delphi/2010-01-26/12431.html


关键字:

关于《DELPHI实现程序间的数据传递》文章的评论

站内搜索: 高级搜索

热门搜索: Windows style 系统 tr IP QQ CPU 安装 function 注册 if td