网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Delphi
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.纸牌控件的编写(中).
.在Delphi中获取和修改文件的时间.
.如何使程序在运行时自动注册Acti.
.用DELPHI的RTTI实现对象的XML持久.
.使用Delphi获取系列信息.
.利用内存映射文件扩充程序可用的.
.控件移动类的实现之二.
.Delphi在MDI窗口中显示图形控件及.
.SQLServer和Oracle的常用函数对比.
.用跨进程子类化技术实现对其它进.
.用DLL方式封装MDI子窗体.
.Delphi图象截取编程示例(4).
.把数据集保存为Excel格式的一个实.
.对Delphi控件的一点改良.
.一个多线程后台扫描的程序和源代.
.为何选择Indy?.
.创建具有托盘的服务程序.
.古都Delphi.
.多层数据库开发四:BDE会话期.
.纸牌控件的编写(上).

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

发表日期:2006-2-4


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

编程时在同一程序中使用全局变量给我们带来了很多方便,大多数程序几乎都离不开全局变量。那么不同的程序之间呢?我们怎样在不同的程序(进程)之间共享数据呢?事实上,你可能已经注意到在不同的进程间使用全局变量在有些场合还是很有必要,这是一项相当有用的技术,基于某中特殊情况我们的确需要在我们开发的不同的程序间共享数据。比如有些软件你会发现安装后不止一个可执行文件,而且在运行时任务栏也不止出现一个进程,但在使用中你发现不同的进程竟向一个单独运行程序一样,效果很好。接下来我们仔细研究一下该技术:
要在不同进程间共享全局变量,应该首先想到我们可以通过不同的进程在内存中的同一块存储区域读取数据,那里就象一个公共场合一样,我们把这样的区域叫做内存映象文件。通过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帮助,里面相当详细,一定能帮助大家学到更多的东西。
上一篇:Delphi代码创建形式规范 人气:3381
下一篇:使用互斥对象让程序只运行一次 人气:5108
浏览全部Delphi的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐