王朝网络
分享
 
 
 

Win9x下程序间的数据传递

王朝delphi·作者佚名  2006-01-08
宽屏版  字体: |||超大  

Win9x下程序间的数据传递

大家知道在Window 9x中一个应用程序不能直接访问另一个程序的内存地址,因为WIN9x为每个运行中的进程提供了自己的虚拟空间,这起到了很好的保护作用,然而,它也使得两个程序间不能轻易的交换数据,但是这并不是说程序间就一定不能进行数据传送了,Win9x为我们提供了几个特殊的方法来实现这个目的,如通过Windows消息WM_CopyData 和存储影响文件等方法。

使用消息WM_CopyData传送需要传递的数据缓冲区的内存地址,前面讲过,我们不能从一个应用程序向另一个程序发送内存块的地址,因为一个虚拟存储空间中的地址在另一个地址空间中没有意义。但是WM_CopyData消息回在后台执行一些特殊操作之后在传递数据,因此我们能够在接受方得到正确的地址。该消息使用时需要传递正在发送消息的窗口的句柄,及一个指TCopyDataStruct结构的指针。该结构如下:

tagCOPYDATASTRUCT = packed record

dwData: DWORD;

//这是一个附加的32位参数;

cbData: DWORD;

//我们将要传递的数据缓冲区的大小;

lpData: Pointer;

//指向数据缓冲区的指针。

end;

TCopyDataStruct=tag COPYDATASTRUCT;

一个例子,SendData程序包含一个文本框,在它的OnChange事件中将文本框中的内容发送到GetData程序重并显示出来。

在SendCopyData程序里,文本框OnChange事件的处理函数如下:

procedure TForm1.InputEditChange(Sender: TObject);

var

cds: TCopyDataStruct;

ss: PChar;

targetHandle: THandle;

begin

cds.cbData:=Length(InputEdit.Text)+1;

GetMem(ss,cds.cbData); //申请cbData大小的缓冲区,并把指针赋给ss;

strCopy(ss,Pchar(InputEdit.text));

cds.lpData:=ss; //设置缓冲区指针

targetHandle:=FindWindow(′TForm1′,′GetCopyData′); //用API函数获取″GetCopyData″窗口句柄

if targetHandle=0 then

begin

ShowMessage(′Don′'t find target window′);

exit;

end;

SendMessage(targetHandle,WM_COPYDATA,Handle,Integer((@cds)));//将cds结构指针发送个目标窗口;

//targetHandle使目标窗口句柄;

//Handle 发送消息的窗口句柄;

FreeMem(ss);

end;

在GetCopyData程序中,通过一个定制的消息处理程序接受wm_CopyData消息:

public

procedure GetCopyData(var msg: TWMCopyData); message WM_COPYDATA;

procedure TForm1.GetCopyData(var msg: TWMCopyData);

begin

with msg.CopyDataStruct^ do

begin

Form1.Edit1.Text:=PChar(lpdata);

end;

end;

其中TWMCopyData结构定义如下:

TWMCopyData = record

Msg: Cardinal;

From: HWND; //发送该消息的窗口的句柄

CopyDataStruct: PCopyDataStruct; //即SendCopyData程序中cds结构的指针

Result: Longint;

end;

除了用wm_CopyData消息传递数据外,Windows还提供了File_Mapping内存共享技术用于实现程序间数据共享。使用与上例窗口相似的两个程序来说明

在MapWrite程序中:

Private

HMapFile: Thanale;

MapFilePointer: Pointer;

procedure TForm1.FormCreate(Sender: TObject);

begin

//使用API函数来建立映象文件

hMapFile:=CreateFileMapping(

$FFFFFFFF, //指定共享内存

nil,

Page_ReadWrite, //共享方式

0,

1000, //共享内存大小

′MyMappedFile′); //映象文件的名字

if hMapFile<>0 then //如果映象文件建立成功

//MapViewOfFile函数返回一个指向共享内存块的在该程序内存空间中有效的指针

MapFilePointer:=MapView OfFile(hMapFile,File-Map-All-Access,0,0,0)

else

ShowMessage(′Can′'t Create MapFile′);

if MapFilePointer=nil then

ShowMessage(′MapFilePointer=nil′);

end;

procedure TForm1.Edit1Change(Sender: TObject);

begin

StrCopy(PChar(MapFilePointer),PChar(Edit1.Text));//将文本框中的字符串copy到共享内存中

end;

在MapRead程序中使用API函数OpenFileMapping打开MapWrite程序中已建立的映象文件

procedure TForm1.FormCreate(Sender: TObject);

begin

hMapFile:=OpenFileMapping(FILE_MAP_READ,true,′MyMappedFile′); //取得′MyMappedFile′映象文件的句柄

if hMapFile<>0 then

MapFilePointer:=MapViewOfFile(hMapFile,File_Map_All_Access,0,0,0)

else

begin

ShowMessage(′Can not open Mapp File′);

Timer1.Enabled:=false;

end;

end;

//定时从共享内存中读取数据并显示出来

procedure TForm1.Timer1Timer(Sender: TObject);

var

ss: String;

begin

ss:=PChar(MapFilePointer);

Edit1.Text:=ss;

end;

当然最后我们要释放共享内存句柄

UnMapViewOfFile(MapFilePointer);

CloseHandle(hMapFile);

(西安 hszj)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有