探讨下在Delphi里面进程之间的数据共享
进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。现在小编就和大家来探讨一下在Delphi里面进程之间的数据共享吧。
一、动态链接库
DLL(即动态链接库),是Dynamic Link Library的缩写形式,它是一个包含可由多个程序同时使用的代码和数据的库。除此之外,它还是实现代码重用的重要手段,创建Windows应用程序。那么问题就来了?当我们需要在进程之间共享数据的时候,应该如何做才可以最简单最快速的将其实现出来呢?如果大家还不知道方法的话,那就跟着小编一起来学习吧。
不知道大家是否知道,在32位应用系统里面,每一个应用程序都会把DLL映射到自己的地址空间里面,同一时间DLL里面的数据也就随之被映射(两个元素的集之间元素相互"对应"的关系)了。这样子操作的话,每一个应用程序都会拥有属于有自己的一个数据实例。当然啦,我们在一个应用程序里面修改DLL中的全局变量,这样子是并不会影响到其它应用程序的。大家是不是觉得,DLL的使用好像和我们要实现的目的有点相背离呢?其实小编也是这样认为,那么怎样才可以真正的实现到我们想要的东西呢?大家想到方法了吗?如果还没有,不妨尝试一下小编的建议吧。在这里,小编要为大家介绍一种技术,那就是内存映射文件,这是一种较为特殊的方法哟,到底有多特殊,现在就来看一看吧。
二、内存映射文件
内存映射文件,是由一个文件到一块内存的映射,内存映射文件与虚拟内存有些类似。在内存映射文件中,为用户提供了一种非常好使的方法。这种方法就是在WIN32系统的地址空间里面,将一块内存区域保留出来,然后物理存储就可以向其中进行提交。另外一个方面,内存映射文件不仅仅只是WIN32的页面文件,还可以是一个磁盘文件。小编认为这两者之中,前者要比后者好用,因为这样子就意味着大家可以像访问一个磁盘文件那样访问内存里面的一个区域了。然而我们再也不需要使用创建一个临时文件,当它用完了以后还得需要将其删除。在WIN32里面就拥有着自己的管理页面调度文件,当大家不需要页面调度文件的时候,系统就会自动将全部有关的区域释放。
三、实现方法
那么接下来小编就向大家演示一下实现方法吧,在这一段编程代码中小编还特意写了注释,希望这对大家有所帮助。另外一个方面,这一个示范例子是在DELPHI6里面编译通过,所以大家一定要注意咯。编程代码如图所示:
- 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.
小编结语:
通过这篇编程语言教程,不知道大家是否已经学会了在Delphi里面进程之间的数据共享呢?在这篇教程中,主要就是向大家介绍一下数据共享。希望这对大家有所帮助。
探讨下在Delphi里面进程之间的数据共享的更多相关文章
- 《Python》进程之间的通信(IPC)、进程之间的数据共享、进程池
一.进程间通信---队列和管道(multiprocess.Queue.multiprocess.Pipe) 进程间通信:IPC(inter-Process Communication) 1.队列 概念 ...
- 进程之间的数据共享 -----Manager模块
展望未来,基于消息传递的并发编程是大势所趋 即便是使用线程,推荐做法也是将程序设计为大量独立的线程集合,通过消息队列交换数据. 这样极大地减少了对使用锁定和其他同步手段的需求,还可以扩展到分布式系统中 ...
- manager 实现进程之间的数据共享 list dict
manager 能够实现进程之间的数据共享 (list,dict) 如果多个进程同事修改同一份共享数据,这个时候需要加锁,保证数据的准确性. (1) dict list 可以实现进程之间的数据共享 ( ...
- 【Linux 进程】之关于父子进程之间的数据共享分析
之前我们通过fork()函数,得知了父子进程之间的存在着代码的拷贝,且父子进程都相互独立执行,那么父子进程是否共享同一段数据,即是否存在着数据共享.接下来我们就来分析分析父子进程是否存在着数据共享. ...
- python 进程之间的数据共享
from multiprocessing import Process,Manager import os def f(d,n): d[os.getpid()] = os.getppid()#对字典d ...
- python全栈开发 * 进程之间的通信,进程之间数据共享 * 180726
进程之间的通信(IPC)队列和管道一.队列 基于管道实现 管道 + 锁 数据安全(一).队列 队列遵循先进先出原则(FIFO) 多用于维护秩序,买票,秒杀 队列的所有方法: put()(给队列里添加数 ...
- python 全栈开发,Day40(进程间通信(队列和管道),进程间的数据共享Manager,进程池Pool)
昨日内容回顾 进程 multiprocess Process —— 进程 在python中创建一个进程的模块 start daemon 守护进程 join 等待子进程执行结束 锁 Lock acqui ...
- python全栈开发day33-进程间的通信、进程间的数据共享,进程池
一.昨日内容回顾: 1. 守护进程 1).p.saemon, 2 ).p.terminate 3 ).p.join 2. 同步控制 1).锁,Lock 互斥锁,解决数据安全.进程之间资源抢占问题. ...
- python全栈开发,Day40(进程间通信(队列和管道),进程间的数据共享Manager,进程池Pool)
昨日内容回顾 进程 multiprocess Process —— 进程 在python中创建一个进程的模块 start daemon 守护进程 join 等待子进程执行结束 锁 Lock acqui ...
随机推荐
- 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_类型转换
1. C# 不要求任何特殊语法即可将一个对象转换为它的任何基类型,因为向基类型的转换被认为是一种安全的隐式转换: 2. 然而,将对象转换为它的某个派生类型时,C#要求开发人员只能进行显示转换,因为这样 ...
- C#工具类之Xml序列化扩展类
using System; using System.IO; using System.Linq; using System.Runtime.Serialization; using System.T ...
- PHP、thinkPHP5.0开发网站文件管理功能(二)删除文件
1.is_dir():检查指定的文件是否是目录 2.scandir():返回指定目录中的文件和目录数组 3.unlink():删除文件,如果删除的文件不存在会报错,加@抑制报错 public func ...
- maya安装错误
AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...
- (转)shell中test命令方法详解
test命令用法.功能:检查文件和比较值 shell中test命令方法详解 原文:https://www.cnblogs.com/guanyf/p/7553940.html 1)判断表达式 if te ...
- 执行ORACLE SQL时如何 忽略替换变量(转载)
你想在SQL*Plus里执行一个脚本,脚本里包含了一些看起来像替换变量的元素,但实际上你并不是想把它们当替换变量来处理.这时你想让解析器忽略它们而不是提示用户输入.解决方案1有一种解决方案就是在&am ...
- eclipse启动的时候报错An internal error occurred during: "Initializing Java Tooling"
eclipse ->windows ->Perspactive -> Reset perspactive 重置视图可以解决
- phpwind本地安装 inernal server error错误
wampserver2.2环境,本地安装phpwind9.0时出错: Internal Server Error The server encountered an internal error or ...
- DEDE文章列表加上序号效果
在文章列表上面加上序号列表的形式,使得文章列表表现得没那么单调,更加丰富一点. {dede:arclist orderby=pubdate type='commend.' titlelen='26' ...
- pat1057. Stack (30)
1057. Stack (30) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Stack is one of ...