Tag Archive | "通信"

Tags: , ,

windows多进程间数据通信:内存映射

Posted on 19 5 月 2015 by simon

啥是进程?进程是一个正在运行的程序的实例,主要由两部分组成:(1)一个操作系统用来管理进程的内核对象。(2)创建时系统所分配的资源,主要是内存地址空间。

为啥要了解进程间数据通信?如果需要在多进程运行下进行协同工作,那么就需要掌握该知识。进程间通信是指在多进程环境下,使用的数据交互、事件通知等方法使各进程协同工作。

常用的有4种:消息传递、共享内存、管道、剪贴板:

(1)消息传递:不以进程为界限,处理消息的是窗体(包括子窗体、控件等),而与是否在同一进程无关。
如SendMessage(hwnd,WM_COPYDATA,wParam,lParam); 其中wParam设置为包含数据的窗口的句柄。lParam指向一个COPYDATASTRUCT的结构:
typedef struct tagCOPYDATASTRUCT{
DWORD dwData;//用户定义数据
DWORD cbData;//数据大小
PVOID lpData;//指向数据的指针
};该结构用来定义用户数据。

(2)共享内存:在一个进程内创建内存映射,却能够在其他都个进程中使用。这些进程共享的是物理存储器的同一个页面,在把这些物理内存映射到虚拟内存时各个进程的虚拟地址并不一定相同。当一个进程将数据写入共享内存时,其他进程可以立即获取数据变更情况。

(3)管道和邮槽:其实是对共享内存的两种不同的封装机制。

(4)剪贴板:Windows系统支持剪贴板IPC的基本机制是由系统预留的一块全局共享内存,可用于被各进程暂时存储数据。写入进程首先创建一个全局内存块,并将数据写到该内存块;接受数据的进程通过剪贴板机制获取此内存块的句柄,并完成对该内存块数据的读取。

关于内存映射:如果物理内存只有一份,让这份内存在不同的进程中,映射到各自的虚拟地址空间上,每个进程都可以读取同一份数据,是一种最高效的数据交换方法。

下面开始讲述共享内存映射的方式

首先使用函数CreateFileMapping来创建一个想共享的文件数据句柄,然后使用MapViewOfFile来获取共享的内存地址,然后使用OpenFileMapping函数在另一个进程里打开共享文件的名称,这样就可以实现不同的进程共享数据

比如有A、B两个进程,

1、A进程中调用内存映射API函数CreateFileMapping创建一个有名字标识的共享内存;

CreateFileMapping原型:
HANDLE CreateFileMapping(
HANDLE hFile, //物理文件句柄
LPSECURITY_ATTRIBUTES lpAttributes, //安全设置
DWORD flProtect, //保护设置
DWORD dwMaximumSizeHigh, //高位文件大小
DWORD dwMaximumSizeLow, //低位文件大小
LPCTSTR lpName //共享内存名称
);

2、再调用MapViewOfFile函数来映射本进程的地址空间(MapViewOfFile支持映射一个超过4G大小的文件,但地址空间最大只有 4G,可以通过设置Offset来只映射一部分文件 )

LPVOID WINAPI MapViewOfFile(
__in HANDLE hFileMappingObject,
__in DWORD dwDesiredAccess,
__in DWORD dwFileOffsetHigh,
__in DWORD dwFileOffsetLow,
__in SIZE_T dwNumberOfBytesToMap
);

hMemFile = CreateFileMappingA (-1, 0, 4, 0, 文本长度, 指针名)’内存文件映射对象
LPSTR = MapViewOfFile (hMemFile, 2, 0, 0, 0) ‘ FILE_MAP_WRITE = 2‘
将待置入的文本写到内存中,用完共享内存,再调用 UnmapViewOfFile 回收内存地址空间UnmapViewOfFile (LPSTR)

3、B进程中读取该内存地址:

hMemFile = OpenFileMappingA (4,True, Lpname)’打开文件映射对象
LPSTR = MapViewOfFile (hMemFile, 4, 0, 0, 0) ‘ FILE_MAP_READ = 4‘MapViewOfFile函数来映射该内存地址
读取指针上数据到文本,再调用UnmapViewOfFile回收内存地址空间UnmapViewOfFile (LPSTR)

 

相关链接:

1、Windows 下的进程间通讯及数据共享:

http://blog.codingnow.com/2005/10/interprocess_communications.html

2、win32下进程间通信——共享内存

http://blog.csdn.net/sszgg2006/article/details/8573348

2、Windows编程专家张静盛指点进程间通信

http://developer.51cto.com/art/200807/82340_all.htm

Comments (0)

斗牛SEO工具