分享
 
 
 

使用内存映象实现进程间全局变量

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

使用内存映象实现进程间全局变量

编程时在同一程序中使用全局变量给我们带来了很多方便,大多数程序几乎都离不开全局变量。那么不同的程序之间呢?我们怎样在不同的程序(进程)之间共享数据呢?事实上,你可能已经注意到在不同的进程间使用全局变量在有些场合还是很有必要,这是一项相当有用的技术,基于某中特殊情况我们的确需要在我们开发的不同的程序间共享数据。比如有些软件你会发现安装后不止一个可执行文件,而且在运行时任务栏也不止出现一个进程,但在使用中你发现不同的进程竟向一个单独运行程序一样,效果很好。接下来我们仔细研究一下该技术:

要在不同进程间共享全局变量,应该首先想到我们可以通过不同的进程在内存中的同一块存储区域读取数据,那里就象一个公共场合一样,我们把这样的区域叫做内存映象文件。通过windows api我们可以很容易的在内存中创建这么一个区域并轻易的读取它。这里需要用到两个关键的api函数:CreateFileMapping和MapViewOfFile,前者在内存中创建一个内存映象区,它需要一些参数包括这块区域的读写权限,唯一区域名称以及数据大小(这些参数将在下面代码的注释中给予说明,更多的参数说明请参看win sdk的帮助文件或查看msdn);后者返回一个指向这块区域的指针以便在程序中调用。下面我们将通过一个简单的例子来说明,这个例子由两个工程组成,一个通过一个按纽负责向内存映象区写入一个长度为11个字符的字符串(‘how are you‘,通过一个edit读入,如果edit中的字符数大于了11个程序将可能出错),另一个则通过一个按纽读出这个字符串,写入一个edit中。下面是部分的代码(为了节省篇幅,加上程序很简单,有些不会影想你阅读的代码没有贴出):

我们首先在第一个工程(窗口取名为SetValue)的单元的接口部分声明一个指向即将创建的内存区域的句柄和一个用来向这个区域写数据的指针变量:

var

……

hFileMapping:HWND;//指向内存区域的句柄

SetString:pchar;//这里应该使用标准的windows字符串而非delphi特有的string类型

这样我们可以在按纽的单击事件中编写相应的代码:

PRocedure TForm1.Button1Click(Sender: TObject);

begin

hFileMapping:=CreateFileMapping($FFFFFFFF,nil,Page_ReadWrite,0,11,'MapString');

//$FFFFFFFF表示使用虚拟文件,注意两个工程中应该使用同一个唯一的名称MapString

if hFileMapping=0 then

raise Exception.Create('Error creating map file!');

SetString:=MapViewOfFile(hFileMapping,File_Map_Write,0,0,11);

strcopy(SetString,pchar(Edit1.Text));

//注意这里应该使用拷贝函数而不是直接赋值 SetString:=pchar(Edit1.Text)

end;

当然,我们还可以在这个主工程中编写一个释放内存映象的过程:

procedure TForm1.Button2Click(Sender: TObject);

begin

UnMapViewOfFile(SetString);

if hFileMapping<>0 then

closehandle(hFileMapping);

end;

接下来是第2个工程的按纽单击事件,它和第一个工程几乎没有什么不同,只是我们修改了内存映象的读取权限为只读而以:

var

……

GetString:pchar;

hMapFileMaping:HWND;

procedure TForm1.Button1Click(Sender: TObject);

begin

hMapFileMaping:=CreateFileMapping($FFFFFFFF,nil,Page_ReadOnly,0,11,'MapString');

//再次注意一定要使用唯一的名称(MapString)和第一个工程保持一致

if hMapFileMaping=0 then

raise Exception.Create('Error');

GetString:=MapViewOfFile(hMapFileMaping,File_Map_Read,0,0,11);

Edit1.Text:=String(GetString);

end;

现在我们便可以测试了,通过下图你可以看到测试情况:

当然,上面的程序只是一个例子,没有任何使用意义,只是为了介绍这种技术,起到抛砖引玉的作用,再实际编程中你可以更严格的控制共享变量。你还可以使用这种技术实现一些奇特的效果。关于一些api函数,它们大多都非常复杂,自己也还没有完全掌握。建议大家在编程中多查看delphi中的win sdk帮助,里面相当详细,一定能帮助大家学到更多的东西。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
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- 王朝網路 版權所有