<b>若何实现进程间数据通讯技术</b>[VC/C++编程]
本文“<b>若何实现进程间数据通讯技术</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
1、引言
在Windows程序中,各个进程之间常常需求交换数据,举行数据通讯.WIN32 API供应了很多函数使我们可以便利高效地举行进程间的通讯,通过这些函数我们可以掌握差别进程间的数据交换,就好像在WIN16中对本地进程举行读写操作一样.
典型的WIN16两进程可以通过同享内存来举行数据交换:(1)进程A将GlobalAlloc(GMEM_SHARE...)API分配一定长度的内存;(2)进程A将GlobalAlloc函数返回的句柄传送给进程B(通过一个登录消息);(3)进程B对这个句柄调用GlobalLock函数,并操纵GlobalLock函数返回的指针拜候数据.这种办法在WIN32中大概失利,这是因为GlobalLock函数返回指向的是进程A的内存,由于进程利用的是虚拟地址而非实际物理地址,因此这一指针仅与A进程有关,而于B进程无关.
本文探究了几种WIN32下进程之间通讯的几种实现办法,读者可以利用差别的办法以到达程序运行高效坚固的目的.
2、Windows95中进程的内存空间管理
WIN32进程间通讯与Windows95的内存管理有密切关系,理解Windows95的内存管理对我们以下的程序计划将会有很大的帮忙,下面我们谈论以下Windows95中进程的内存空间管理.
在WIN16下,全部Windows利用程序同享单一地址,任何进程都可以对这一空间中属于同享单一的地址空间和属于其他进程的内存举行读写操作,乃至可以存取操作系统本身的数据,这样便大概破坏其他程序的数据段代码.
在WIN32下,每个进程都有自己的地址空间,一个WIN32进程不能存取另一个地址的私有数据,两个进程可以用具有相同值的指针寻址,但所读写的只是它们各自的数据,这样就削减了进程之间的彼此干扰.另一方面,每个WIN32进程拥有4GB的地址空间,但并不代表它真正拥有4GB的实际物理内存,而只是操作系统操纵CPU的内存分配功效供应的虚拟地址空间.在普通情形下,绝大大都虚拟地址并没有物理内存与它对应,在真正可以利用这些地址空间之前,还要由操作系统供应实际的物理内存(这个历程叫“提交”commit).在差别的情形下,系统提交的物理内存是差别的,大概是RAM,也大概是硬盘模拟的虚拟内存.
3、WIN32中进程间的通讯
在Windows 95中,为实现进程间平等的数据交换,用户可以有以下几种挑选:
* 利用内存映射文件
* 通过同享内存DLL同享内存
* 向另一进程发送WM_COPYDATA消息
* 调用ReadProcessMemory以及WriteProcessMemory函数,用户可以发送由GlobalLock(GMEM_SHARE,...)函数调用提取的句柄、GlobalLock函数返回的指针以及VirtualAlloc函数返回的指针.
--3.1、操纵内存映射文件实现WIN32进程间的通讯
Windows95中的内存映射文件的机制为我们高效地操作文件供应了一种途径,它答应我们在WIN32进程中保存一段内存区域,把目标文件映射到这段虚拟内存中.在程序实现中必须考虑各进程之间的同步.具体实现步骤以下:
首先我们在发送数据的进程中需求通过调用内存映射API函数CreateFileMapping成立一个闻名的同享内存:
HANDLE CreateFileMapping(
HANDLE hFile, // 映射文件的句柄,
//设为0xFFFFFFFF以成立一个进程间同享的对象
LPSECURITY_ATTRIBUTES lpFileMappingAttributes, // 安全属性
DWORD flProtect, // 保护方法
DWORD dwMaximumSizeHigh, //对象的大小
DWORD dwMaximumSizeLow,
LPCTSTR lpName // 必须为映射文件命名
);
与虚拟内存近似,保护方法可以是PAGE_READONLY或是PAGE_READWRITE.假如多进程都对同一同享内存举行写拜候,则必须保持彼此间同步.映射文件还可以指定PAGE_WRITECOPY标志,可以保证其原始数据不会遭到破坏,同时答应其他进程在必要时安闲地操作数据的拷贝.
在成立文件映射对象后利用可以调用MapViewOfFile函数映射到本进程的地址空间内.
下面阐明成立一个名为MySharedMem的长度为4096字节的闻名映射文件:
HANDLE hMySharedMapFile=CreateFileMapping((HANDLE)0xFFFFFFFF),
NULL,PAGE_READWRITE,0,0x1000,“MySharedMem”);
并映射缓存区视图:
LPSTR pszMySharedMapView=(LPSTR)MapViewOfFile(hMySharedMapFile,
FILE_MAP_READ|FILE_MAP_WRITE,0,0,0);
其他进程拜候同享对象,需求得到对象名并调用OpenFileMapping函数.
HANDLE hMySharedMapFile=OpenFileMapping(FILE_MAP_WRITE,
FALSE,“MySharedMem");
一旦其他进程得到映射对象的句柄,可以像成立进程那样调用MapViewOfFile函数来映射对象视图.用户可以利用该对象视图来举行数据读写操作,以到达数据通讯的目的.
当用户进程完毕利用同享内存后,调用UnmapViewOfFile函数以撤消其地址空间内的视图:
if (!UnmapViewOfFile(pszMySharedMap
View))
{ AfxMessageBox(“could not unmap view of file"); }
以上是“<b>若何实现进程间数据通讯技术</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |