1、编程语言为delphi;
2、通信的单位为一个记录(Record);
3、两个程序在同一台机子上运行。请问怎样用代码实现两个程序之间的通信?
包括从程序A发送一个记录给程序B,从程序B发送
一个记录给程序A。小弟愚钝,还望大虾们能够提供具体的代码。
2、通信的单位为一个记录(Record);
3、两个程序在同一台机子上运行。请问怎样用代码实现两个程序之间的通信?
包括从程序A发送一个记录给程序B,从程序B发送
一个记录给程序A。小弟愚钝,还望大虾们能够提供具体的代码。
解决方案 »
- 为什么我将窗体停靠进PageControl无法拖出
- 表的添加删除
- [新手请教]函数返回的是对象时,返回的是值还是地址。
- 关于异常处理的一个问题
- excel输出,不同列要同时在一个表中输出的问题。
- 关于Dxdbtreeview的问题继续问!
- 我想在下拉框中出现tree形,可以让用户选择,请问这个如何实现?
- 请问在使用NMFTP时如何获取远端指定目录是否存在的信息?(50)
- 问一个 关于IdUDPClient广播消息的问题
- 如何实现这样的功能:select * from select * from table
- listview控件的节点有关键词马?就是可以唯一标识该节点的
- 如何用代码自动创建控件如edit文本框,请各位e们帮个忙!急!
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure p(var msg:twmcopydata);message wm_copydata;
end;var
Form1: TForm1;implementation{$R *.DFM}
type
pdata=^tdata;
tdata=record
name:string[100];
author:string[100];
end;procedure tform1.p(var msg:twmcopydata);
var
k:pdata;
begin
k:=msg.CopyDataStruct.lpdata;
showmessage('name:'+k^.name);
showmessage('author:'+k^.author);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
buf:pdata;
t:tcopydatastruct;
begin
buf^.name:='hello';
buf^.author:='hey';
t.dwdata:=1;
t.cbdata:=sizeof(buf^);
t.lpdata:=buf;
sendmessage(handle,wm_copydata,handle,longint(@t));
end;end.
转成两个程序的五分钟够吗,哈哈。
t的地址传过去没有用的。两个进程之间的通信涉及到进程间通信的问题,一般可以通过FileMapping或
管道(nt才行)等进行。
老兄高见,我怎么就没想到呢。那就用filemapping吧。
这是我原来写的,一般不是这样用的
一般使用管道数据通信的.
The WM_COPYDATA message is sent when an application passes data to another application.
应该可以这样用的,也许访问其它进程的内存空间的限制在消息机制中不起作用吧。
用这个类,使用下面的函数:
function Send(AHandle:Cardinal;P:pointer;Len:integer;wParam:integer=0;dwData:cardinal=0):integer;overload;
其中的p就是你的recird的地址,用@取得,len就是sizeof(你的record);
///////////////////////////////////////////////////////////
unit ShareMem_San;
interface
uses
windows,messages,sysutils,debug_san;/////////////////////////////////////
type
TCopyData_San=class
private
CD:TcopyDataStruct;
procedure SetData(p:pointer;len:integer;dwData:cardinal);
public
function Send(AHandle:Cardinal;AStr:string;wParam:integer=0;dwData:cardinal=0):integer;overload;
function Send(AHandle:Cardinal;P:pointer;Len:integer;wParam:integer=0;dwData:cardinal=0):integer;overload; end;
///////////////////////
function GetCopyData(AMsg:TWMCopyData):string;overload;
procedure GetCopyData(AMsg:TWMCopyData;var P:pointer;var len:integer);overload;implementation
procedure GetCopyData(AMsg:TWMCopyData;var P:pointer;var len:integer);
begin
p:=amsg.CopyDataStruct.lpData;
len:=amsg.CopyDataStruct.cbData;
end;
function GetCopyData(AMsg:TWMCopyData):string;
var
i,len:integer;
type
pstr=array of char;
begin
result:='';
len:=amsg.CopyDataStruct.cbData;
if len<=0 then exit;
setlength(result,len);
for i:=1 to len do
begin
result[i]:=pstr(amsg.CopyDataStruct.lpData)[i-1];
end;
end;{ TCopyData_San }function TCopyData_San.Send(AHandle: Cardinal; AStr: string;wParam:integer=0;dwData:cardinal=0): integer;
var
len:integer;
begin len:=length(astr);
if len<=0 then exit;
result:=send(ahandle,@astr[1],len,wparam,dwdata);end;function TCopyData_San.Send(AHandle: Cardinal; P: pointer;
Len: integer;wParam:integer=0;dwData:cardinal=0): integer;
begin
setdata(p,len,dwdata);
result:=sendmessage(ahandle,wm_copydata,wparam,Cardinal(@cd));
end;procedure TCopyData_San.SetData(p: pointer; len: integer;dwData:cardinal);
begin
cd.cbData:=len;
cd.lpData:=p;
cd.dwData:=dwData;
end;
////////////////////////////end.
这个单元提供了2个工具函数:
function GetCopyData(AMsg:TWMCopyData):string;overload;
procedure GetCopyData(AMsg:TWMCopyData;var P:pointer;var len:integer);overload;
在你的接收程序里面(如果也是用delphi作的话),
处理wm_copydata消息,把msg参数传进去,你就能得到发来的record的指针和长度。
////////////////////////////
怎样处理wm_copydata消息?在你的窗体单元的private部分写:
procedure HandleCopydata(var msg:tmessage);message wm_copydata;
然后按crel+shift+c,你就可以在这里处理wm_copydata消息,并用
function GetCopyData(AMsg:TWMCopyData):string;overload;
得到你的那个record的所有信息!
procedure GetCopyData(AMsg:TWMCopyData;var P:pointer;var len:integer);overload;