[求思路]Dephi与外部程序通讯 目前我的程序需要与外部程序通讯:外部程序能够通过某种方式向我的程序发送字符串;我的程序处理后返回处理结果。求思路,用com,消息还是什么。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 1)用消息+剪贴板2)用消息+原子(Atom) 方法很多啊Socket命名管道 CreateNamePipe + 事件叶面文件 MapViewOfFile + 事件 1、首先开辟一个共享内存2、程序中间发送是否有数据到代的自定义消息3、接收到消息后,读写内存注意:如果有需要,使用互斥对象对数据进行保护如果没有特别要求,最简单的实现思路是用WM_COPYDATA,其实微软对于WM_COPYDATA消息的实现机制也是基于内存共享的方式楼上说的其他方法都可以,各有各的优点和缺点。例如socket建立TCP/IP连接,数据是直接发送过去的,接收端需要使用线程轮询或者事件通知的方式接收处理数据,你无须负责共享内存的管理,但需要单独维护他们之间的通讯链路如果使用消息+××共享的方式,数据到代采用消息通知的方式,你只需要在得到消息后,从指定共享内存区域读取数据并处理,不需要维护连接。给你一个用WM_COPYDATA的例子发送端:unit SetForm;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);var cpt : TCopyDataStruct; Findhd : THandle;begin // ShowMessage(inttostr(length(Edit1.Text))); Findhd := FindWindow(nil,pchar('GetCopyData')); if Findhd <> 0 then begin cpt.cbData := length(Edit1.Text)+1; GetMem(cpt.lpData,cpt.cbData); StrCopy(cpt.lpData,pchar(Edit1.Text)); SendMessage(Findhd,WM_COPYDATA,Handle,Cardinal(@cpt)); FreeMem(cpt.lpData); end else showmessage('没有找到目标窗口');end;end.接收端:unit Getdata;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Edit1: TEdit; Button1: TButton; private procedure MyCopyDataMessage(var msg : TWMCopyData);message wm_copydata; public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}{ TForm1 }procedure TForm1.MyCopyDataMessage(var msg: TWMCopyData);beginEdit1.Text := StrPas(msg.CopyDataStruct^.lpData);end;end. 灵活运用Event和Shared Memory File是最好的 如何比较数据库中的时间和DateTimePicker1组件中的时间? 关于字符串相加的问题 dbgrid的行无法选中 查询语句中引号的应用,困扰我一晚上了。 请问在自已做的DLL中登陆数据库(ORACLE),怎么样去掉登陆窗口?谢谢! 求delphi開發的自動發送email的程序 如何发布 数据库软件? 不耻下问!!!! 关于事件句柄! 如何编程实现把指定的IP地址修改为动态获取IP地址? 在DEPHI中如何将ScriptErrorsSuppressed的属性添加到TWebBrowser上 IdHTTP 里如何http header中指定一些信息来验证设备的身份
2)用消息+原子(Atom)
命名管道 CreateNamePipe + 事件
叶面文件 MapViewOfFile + 事件
2、程序中间发送是否有数据到代的自定义消息
3、接收到消息后,读写内存注意:如果有需要,使用互斥对象对数据进行保护
如果没有特别要求,最简单的实现思路是用WM_COPYDATA,其实微软对于WM_COPYDATA消息的实现机制也是基于内存共享的方式楼上说的其他方法都可以,各有各的优点和缺点。例如socket建立TCP/IP连接,数据是直接发送过去的,接收端需要使用线程轮询或者事件通知的方式接收处理数据,你无须负责共享内存的管理,但需要单独维护他们之间的通讯链路
如果使用消息+××共享的方式,数据到代采用消息通知的方式,你只需要在得到消息后,从指定共享内存区域读取数据并处理,不需要维护连接。给你一个用WM_COPYDATA的例子发送端:
unit SetForm;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
cpt : TCopyDataStruct;
Findhd : THandle;
begin
// ShowMessage(inttostr(length(Edit1.Text))); Findhd := FindWindow(nil,pchar('GetCopyData'));
if Findhd <> 0 then
begin
cpt.cbData := length(Edit1.Text)+1;
GetMem(cpt.lpData,cpt.cbData);
StrCopy(cpt.lpData,pchar(Edit1.Text));
SendMessage(Findhd,WM_COPYDATA,Handle,Cardinal(@cpt));
FreeMem(cpt.lpData);
end else showmessage('没有找到目标窗口');end;end.接收端:
unit Getdata;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
private
procedure MyCopyDataMessage(var msg : TWMCopyData);message wm_copydata;
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}{ TForm1 }procedure TForm1.MyCopyDataMessage(var msg: TWMCopyData);
beginEdit1.Text := StrPas(msg.CopyDataStruct^.lpData);
end;end.