如何实现进程间数据通讯技术

如何实现进程间数据通讯技术,第1张

如何实现进程间数据通讯技术,第2张

1.介绍

在Windows程序中,进程之间经常需要进行数据交换和数据通信。WIN32 API提供了许多功能,使我们能够方便有效地在进程之间进行通信。通过这些函数,我们可以控制不同进程之间的数据交换,就像WIN16中对本地进程的读写一样。
两个典型的WIN16进程可以通过共享内存来交换数据:(1)进程A分配一定长度的内存给Globallloc (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的内存分配功能提供的虚拟地址空。正常情况下,大多数虚拟地址并没有与之对应的物理内存。在使用这些地址空之前,操作系统应该提供实际的物理内存(这个过程称为& ldquo提交& rdquo提交).不同情况下,系统提交的物理内存是不一样的,可能是RAM,也可能是硬盘模拟的虚拟内存。

3.WIN32中进程间的通信

在Windows 95中,为了实现进程间平等的数据交换,用户可以有以下选择:
*使用内存映射文件
*通过共享内存DLL共享内存
*向另一个进程发送WM_COPYDATA消息
*调用ReadProcessMemory和WriteProcessMemory函数,用户可以发送由全局锁提取的句柄(GMEM _共享...)函数调用,GlobalLock函数返回的指针和VirtualAlloc函数返回的指针。

-3.1.使用内存映射文件实现WIN32进程间的通信。

Windows95中内存映射文件的机制为我们提供了一种高效操作文件的方法。它允许我们在WIN32进程中保留一个内存区域,并将目标文件映射到这个虚拟内存中。程序实现中必须考虑进程间的同步。具体步骤如下:
首先我们需要通过调用内存映射API函数CreateFileMapping来创建一个著名的共享内存:
Handle创建文件映射(
Handle HFILE,//映射文件的句柄,
//设置为0xFFFFFFFF创建一个进程间共享对象
LP security _ attributes lpfilemappingattributes,//安全属性
DWORD flProtect,//保护模式
DWORD dwmaximumsize
类似于虚拟内存,可以用PAGE_READONLY或PAGE_READWRITE来保护。如果多个进程写入同一个共享内存,它们必须彼此保持同步。映射文件还可以指定PAGE_WRITECOPY标志,这样可以保证其原始数据不会被破坏,同时允许其他进程在必要时自由复制数据。
文件映射对象创建后,可以通过调用MapViewOfFile函数映射到该进程的地址空。
下面给出了创建一个名为MySharedMem的长度为4096字节的著名映射文件的指令:
handle hmysharemapfile = create file mapping((handle)0x ffffffff),
NULL,PAGE_READWRITE,0,0x1000,& ldquoMySharedMem & rdquo);
并映射缓冲区视图:
lpstr pszmysharemapview =(lpstr)mapviewoffile(hmysharemapfile,
file _ map _ read | file _ map _ write,0,0,0);
其他进程访问共享对象时,需要获取对象名,调用OpenFileMapping函数。
HANDLE hMySharedMapFile = openfile mapping(FILE _ MAP _ WRITE,
FALSE,& ldquoMySharedMem ");
一旦其他进程获得映射对象的句柄,它们就可以像创建进程一样调用MapViewOfFile函数来映射对象视图。用户可以使用这个对象视图来读写数据,达到数据通信的目的。
当用户进程使用完共享内存后,调用UnmapViewOfFile函数取消其地址中的视图空:
if(!UnmapViewOfFile(pszMySharedMap
View))
{ AfxMessageBox(& ldquo;无法取消文件视图的映射”);}

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 如何实现进程间数据通讯技术

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情