浅谈Delphi中进程间的数据共享-Delphi-优质IT资源分享社区

admin
管理员
管理员
  • UID1
  • 粉丝30
  • 关注4
  • 发帖数581
  • 社区居民
  • 忠实会员
  • 原创写手
阅读:222回复:0

浅谈Delphi中进程间的数据共享

楼主#
更多 发布于:2016-06-07 22:57

 
DLL是
创造Windows
运用程序,完成代码重用的首要
意图 。那么当咱们需要在
进程间同享数据时,
怎么做
威力方便容易地完成呢?在32位
运用体系中,每个
运用程序会将DLL映射到自个的地址空间,一起DLL中的数据也就随之被映射了 。这么,每个
运用程序都有自个的数据实例,在一个
运用程序中
修改DLL中的全局变量,不会影响其它的
运用程序 。DLL的
运用
似乎与咱们的
方针相违背,那么怎么
威力完成咱们想要的东东呢?这儿给咱们介绍一种格外的技能,那就是内存映射文件 。
内存映射文件供给了一种
进程,就是在WIN32体系的地址空间保存一块内存区域,物理存储
能够向其间提交 。并且内存映射文件
不仅是磁盘文件,也
能够是WIN32的页面文件,并且后者比前者要好,因为这
标志着
能够像
访问一个磁盘文件那样
访问内存中的一个区域,而不必
创造暂时文件,用完后还得删去它 。WIN32有自个的管理页面调度文件,当不需要页面调度文件时,体系会主动将有关区域
开释 。以下是详细的完成代码:
library Project1;
菜鸟必备镜头之大光圈定焦镜拍照窍门站点点击率与网站排行的联系同享
告诉你iOS5不易被发现的功用菜鸟进阶记 风景拍摄窍门同享
uses
shareMem,
windows,
水平进步7步走 深度解读啥才叫好的人像网站优化与SEO是一回事吗?
IE 8浏览器加快窍门Win7体系不相同的小功用汇总
SysUtils,
Classes;
const
MFileName: Pchar = ’ShareData’;
//界说一个记载类型,你所需要同享的数据就
保存在这儿 。
//当在
进程中调用GetDllData时,
进程中也应当界说一个与这个相同的记载类型 。
type
PGlobalDllData = ^TGlobalDllData;
TGlobalDllData = record
s: string[50];
i: integer;
end;
var
GlobalData: PGlobalDllData; //这是一个全局变量,指向
创造的内存映射文件 。
MapHandle: THandle;
//给外部
进程调用的进程,当外部
进程调用这个进程后,形参AGlobalData就指向了我//们
创造的内存映射文件. 咱们
能够
创造两个
进程, 一起调用这个进程, 那么在其间一个进 //程中
修改数据后, 在别的一个
进程中既可
反应出来, 完成了咱们需要的同享.
procedure GetDllData(var AGlobalData: PGlobalDllData);stdcall; begin
AGlobalData := GlobalData;
end;
procedure OpenThisData;
var
size: integer;
begin
size := sizeof(TGlobalDllData);
//
创造一个内存文件映射方针,MfileName
保存的值就是该方针的姓名 。
mapHandle := CreateFileMapping(Dword(-1), nil, page_readWrite, 0, size,
MFileName);
if mapHandle = 0 then
RaiseLastWin32Error;
//把文件的视图映射到调用
进程的地址空间,该函数的返回值就是该方针的首地址 。注//意,这是调用
进程的地址,两个
运用程序调用该DLL,返回值是不相同的 。
GlobalData := MapViewOfFile(mapHandle, File_map_all_Access, 0, 0,
size);
Globaldata^.s := ’TEST’;
GlobalData^.i := 5;
if GlobalData = nil then
begin
CloseHandle(MapHandle);
RaiseLastWin32Error;
end;
end;
//DLL从
进程中
离散出来时,应当
开释相应的空间
procedure CloseThisData;
begin
unmapViewOfFile(GlobalData);
closeHandle(MapHandle);
end;
procedure DllEntryPoint(dwReason: DWord);
begin
case dwReason of
Dll_Process_Attach: OpenThisData; //调用DLL时传入的参数,由体系主动传入
Dll_Process_Detach: CloseThisData; //
开释DLL时传入的参数,体系主动传入 。
end;
end;
{$R *.res}
exports
GetDllData; //外部
运用程序调用的就是这个进程 。
begin
DllProc := @DllEntryPoint; //该变量是一个全局变量,由它来指定DLL的进口及出 //口函数 。
DllEntryPoint(Dll_Process_Attach);
end.
//以上代码在DELPHI6中编译经过 。
DLL是
创造Windows
运用程序,完成代码重用的首要
意图 。那么当咱们需要在
进程间同享数据时,
怎么做
威力方便容易地完成呢?在32位
运用体系中,每个
运用程序会将DLL映射到自个的地址空间,一起DLL中的数据也就随之被映射了 。这么,每个
运用程序都有自个的数据实例,在一个
运用程序中
修改DLL中的全局变量,不会影响其它的
运用程序 。DLL的
运用
似乎与咱们的
方针相违背,那么怎么
威力完成咱们想要的东东呢?这儿给咱们介绍一种格外的技能,那就是内存映射文件 。
内存映射文件供给了一种
进程,就是在WIN32体系的地址空间保存一块内存区域,物理存储
能够向其间提交 。并且内存映射文件
不仅是磁盘文件,也
能够是WIN32的页面文件,并且后者比前者要好,因为这
标志着
能够像
访问一个磁盘文件那样
访问内存中的一个区域,而不必
创造暂时文件,用完后还得删去它 。WIN32有自个的管理页面调度文件,当不需要页面调度文件时,体系会主动将有关区域
开释 。以下是详细的完成代码:
library Project1;
uses
shareMem,
windows,
SysUtils,
Classes;
const
MFileName: Pchar = ’ShareData’;
//界说一个记载类型,你所需要同享的数据就
保存在这儿 。
//当在
进程中调用GetDllData时,
进程中也应当界说一个与这个相同的记载类型 。
type
PGlobalDllData = ^TGlobalDllData;
TGlobalDllData = record
s: string[50];
i: integer;
end;
var
GlobalData: PGlobalDllData; //这是一个全局变量,指向
创造的内存映射文件 。
MapHandle: THandle;
//给外部
进程调用的进程,当外部
进程调用这个进程后,形参AGlobalData就指向了我//们
创造的内存映射文件. 咱们
能够
创造两个
进程, 一起调用这个进程, 那么在其间一个进 //程中
修改数据后, 在别的一个
进程中既可
反应出来, 完成了咱们需要的同享.
procedure GetDllData(var AGlobalData: PGlobalDllData);stdcall; begin
AGlobalData := GlobalData;
end;
procedure OpenThisData;
var
size: integer;
begin
size := sizeof(TGlobalDllData);
//
创造一个内存文件映射方针,MfileName
保存的值就是该方针的姓名 。
mapHandle := CreateFileMapping(Dword(-1), nil, page_readWrite, 0, size,
MFileName);
if mapHandle = 0 then
RaiseLastWin32Error;
//把文件的视图映射到调用
进程的地址空间,该函数的返回值就是该方针的首地址 。注//意,这是调用
进程的地址,两个
运用程序调用该DLL,返回值是不相同的 。
GlobalData := MapViewOfFile(mapHandle, File_map_all_Access, 0, 0,
size);
Globaldata^.s := ’TEST’;
GlobalData^.i := 5;
if GlobalData = nil then
begin
CloseHandle(MapHandle);
RaiseLastWin32Error;
end;
end;
//DLL从
进程中
离散出来时,应当
开释相应的空间
procedure CloseThisData;
begin
unmapViewOfFile(GlobalData);
closeHandle(MapHandle);
end;
procedure DllEntryPoint(dwReason: DWord);
begin
case dwReason of
Dll_Process_Attach: OpenThisData; //调用DLL时传入的参数,由体系主动传入
Dll_Process_Detach: CloseThisData; //
开释DLL时传入的参数,体系主动传入 。
end;
end;
{$R *.res}
exports
GetDllData; //外部
运用程序调用的就是这个进程 。
begin
DllProc := @DllEntryPoint; //该变量是一个全局变量,由它来指定DLL的进口及出 //口函数 。
DllEntryPoint(Dll_Process_Attach);
end.
//以上代码在DELPHI6中编译经过 。















优质IT资源分享社区为你提供此文。
本站有大量优质Delphi教程视频,资料等资源,包含Delphi基础教程,高级进阶教程等等,教程视频资源涵盖传智播客,极客学院,达内,北大青鸟,猎豹网校等等IT职业培训机构的培训教学视频,价值巨大。欢迎点击下方链接查看。
Delphi教程视频


优质IT资源分享社区(www.itziyuan.top)
一个免费,自由,开放,共享,平等,互助的优质IT资源分享网站。
专注免费分享各大IT培训机构最新培训教学视频,为你的IT学习助力!

!!!回帖受限制请看点击这里!!!
!!!资源失效请在此版块发帖说明!!!

[PS:按 CTRL+D收藏本站网址~]

——“优质IT资源分享社区”管理员专用签名~

本版相似帖子

游客