2022年Windows进程间数据通讯的实现技术 .pdf
《2022年Windows进程间数据通讯的实现技术 .pdf》由会员分享,可在线阅读,更多相关《2022年Windows进程间数据通讯的实现技术 .pdf(6页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Windows 95进程间数据通讯的实现技术1、引言在 Windows程序中,各个进程之间常常需要交换数据,进行数据通讯。 WIN32 API 提供了许多函数使我们能够方便高效的进行进程间的通讯,通过这些函数我们可以控制不同进程间的数据交换, 就如同在 WIN16中对本地进程进行读写操作一样。典型的 WIN16两进程可以通过共享内存来进行数据交换:(1)进程 A将GlobalAlloc (GMEM_SHARE.)API 分配一定长度的内存;( 2)进程 A将 GlobalAlloc函数返回的句柄传递给进程 B (通过一个登录消息);(3) 进程 B对这个句柄调用 GlobalLock 函数,并
2、利用 GlobalLock 函数返回的指针访问数据。这种方法在WIN32中可能失败,这是因为 GlobalLock 函数返回指向的是进程A的内存,由于进程使用的是虚拟地址而非实际物理地址,因此这一指针仅与A进程有关,而于 B进程无关。本文探讨了几种 WIN32下进程之间通讯的几种实现方法, 读者可以使用不同的方法以达到程序运行高效可靠的目的。2、Windows95中进程的内存空间管理WIN32进程间通讯与 Windows95的内存管理有密切关系, 理解 Windows95的内存管理对我们如下的程序设计将会有很大的帮助,下面我们讨论以下Windows95中进程的内存空间管理。在 WIN16下,所
3、有 Windows应用程序共享单一地址, 任何进程都能够对这一空间中属于共享单一的地址空间, 任何进程都能够对这一空间中属于其他进程的内存进行读写操作, 甚至可以存取操作系统本身的数据, 这样就可能破坏其他程序的数据段代码。在 WIN32下,每个进程都有自己的地址空间, 一个 WIN32进程不能存取另一个地址的私有数据,两个进程可以用具有相同值的指针寻址,但所读写的只是它们各自的数据,这样就减少了进程之间的相互干扰。另一方面,每个 WIN32进程拥有 4GB的地址空间,名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理
4、 - - - - - - - 第 1 页,共 6 页 - - - - - - - - - 但并不代表它真正拥有4GB的实际物理内存,而只是操作系统利用CPU 的内存分配功能提供的虚拟地址空间。 在一般情况下, 绝大多数虚拟地址并没有物理内存于它对应,在真正可以使用这些地址空间之前,还要由操作系统提供实际的物理内存(这个过程叫“提交” commit)。在不同的情况下,系统提交的物理内存是不同的,可能是RAM ,也可能是硬盘模拟的虚拟内存。3、WIN32中进程间的通讯在 Windows 95 中,为实现进程间平等的数据交换,用户可以有如下几种选择:* 使用内存映射文件* 通过共享内存 DLL共享内
5、存* 向另一进程发送 WM_COPYDATA消息* 调用 ReadProcessMemory 以及 WriteProcessMemory 函数,用户可以发送由GlobalLock(GMEM_SHARE,.)函数调用提取的句柄、 GlobalLock 函数返回的指针以及 VirtualAlloc函数返回的指针。3.1 、利用内存映射文件实现WIN32进程间的通讯Windows95中的内存映射文件的机制为我们高效地操作文件提供了一种途径,它允许我们在 WIN32进程中保留一段内存区域, 把目标文件映射到这段虚拟内存中。在程序实现中必须考虑各进程之间的同步。具体实现步骤如下:首先我们在发送数据的进程
6、中需要通过调用内存映射API 函数CreateFileMapping创建一个有名的共享内存:HANDLE CreateFileMapping( HANDLE hFile, / 映射文件的句柄,/ 设为 0 xFFFFFFFF 以创建一个进程间共享的对象LPSECURITY_ATTRIBUTES lpFileMappingAttributes, / 安全属性DWORD flProtect, / 保护方式DWORD dwMaximumSizeHigh, / 对象的大小DWORD dwMaximumSizeLow, LPCTSTR lpName / 必须为映射文件命名); 与虚拟内存类似,保护方式可
7、以是PAGE_READONLY或是 PAGE_READWRITE。如果多进程名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 6 页 - - - - - - - - - 都对同一共享内存进行写访问,则必须保持相互间同步。映射文件还可以指定PAGE_WRITECOPY标志,可以保证其原始数据不会遭到破坏,同时允许其他进程在必要时自由的操作数据的拷贝。在创建文件映射对象后使用可以调用MapViewOfFile 函数映射到本进程的地址空间内。下面说明创建一个名为MySharedM
8、em 的长度为 4096 字节的有名映射文件:HANDLE hMySharedMapFile=CreateFileMapping(HANDLE)0 xFFFFFFFF) ,NULL ,PAGE_READWRITE,0,0 x1000,MySharedMem) ;并映射缓存区视图:LPSTR pszMySharedMapView=(LPSTR)MapViewOfFile(hMySharedMapFile ,FILE_MAP_READ|FILE_MAP_WRITE,0,0,0); 其他进程访问共享对象,需要获得对象名并调用OpenFileMapping 函数。HANDLE hMySharedMap
9、File=OpenFileMapping(FILE_MAP_WRITE,FALSE ,MySharedMem); 一旦其他进程获得映射对象的句柄,可以象创建进程那样调用MapViewOfFile函数来映射对象视图。 用户可以使用该对象视图来进行数据读写操作,以达到数据通讯的目的。当用户进程结束使用共享内存后, 调用 UnmapViewOfFile 函数以取消其地址空间内的视图:if (!UnmapViewOfFile(pszMySharedMapView) AfxMessageBox(could not unmap view of file); 3.2 、利用共享内存 DLL 共享数据 DLL
10、允许进程以类似于 Windows 3.1 DLL共享数据的方式访问读写数据,多个进程都可以对该共享数据DLL进行数据操作,达到共享数据的目的。在WIN32中为建立共享内存,必须执行以下步骤:首先创建一个有名的数据区。这在Visual C+ 中是使用 data_seg pragma 宏。使用 data_seg pragma 宏必须注意数据的初始化:#pragma data_seg(MYSEC) charMySharedData4096=0; #pragma data_seg() 然后在用户的 DEF文件中为有名的数据区设定共享属性。LIBRARY TEST DATA READ WRITE 名师资
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年Windows进程间数据通讯的实现技术 2022 Windows 进程 数据通讯 实现 技术
限制150内