首页 Windows下进程间通信方式探讨

Windows下进程间通信方式探讨

举报
开通vip

Windows下进程间通信方式探讨 文章编号: 1007- 757X( 2006) 12- 0058- 03 Windows 下进程间通信方式探讨 梁 庚, �白 焰� 摘 要:进程间通信和数据交换是Window s 应用程序中要经常涉及到的一个重要问题。本文扼要概括了w indows 进程间通 信的两种模式并对其各自的特点进行了阐述。在此基础上针对第二种模式的进程间通信的特点提出了一种新的具体实用的方案 并对该方案的实现方式进行了详尽的认证和阐述,并给出了一个详细具体的应用实例。 关键词: 进程;通信; 数据交换;钩子函数; 内存映像 中图...

Windows下进程间通信方式探讨
文章编号: 1007- 757X( 2006) 12- 0058- 03 Windows 下进程间通信方式探讨 梁 庚, �白 焰� 摘 要:进程间通信和数据交换是Window s 应用程序中要经常涉及到的一个重要问题。本文扼要概括了w indows 进程间通 信的两种模式并对其各自的特点进行了阐述。在此基础上针对第二种模式的进程间通信的特点提出了一种新的具体实用的 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 并对该方案的实现方式进行了详尽的认证和阐述,并给出了一个详细具体的应用实例。 关键词: 进程;通信; 数据交换;钩子函数; 内存映像 中图分类号: TP319   文献标识码: A 1 引言 进程间通信是w indow s 应用程序中要经常涉及到的一个 问题, 进程间的数据交换对于许多应用是至关重要的, 尤其是 随着软件开发模式的逐渐走向分散化和模块化, 小到函数模 块间, 大到系统内各进程模块间的数据交换愈发频繁起来, 这 使得这种重要情愈发显得突出,因此很好的解决进程间的数 据交换和通信问题就显得重要起来。 2 进程间通信的两种模式及其特点 按照软件开发方来划分, window s 系统内各个进程基本 可划分为两类, 已方进程和他方进程。已方进程即由软件开发 方开发的应用程序进入系统后形成的进程, 而软件开发方开 发的应用程序以外的应用程序进入系统后形成的进程称为他 方进程。由此产生了两种不同性质的进程间的通信模式: I、已方进程之间的通信 II、已方进程和他方进程间的通信 对于第一种模式的进程间通信, 通信双方进程的彼此都 来自于同一软件开发方, 进程间通信的协议、数据和内容都可 由软件开发方在软件设计阶段统一加以考虑,这就为进程间 通信在运行时实现提供了巨在的便利。软件开发方在软件设 计阶段充分考虑到进程间通信的需求,进而主动采取某种较 为成熟的通信实现方式来分别设计实现进程间通信的客户端 和服务器端, 从而形式进程间通信的既成的“默契”, 这种“默 契”实际上是在软件设计阶段就取得了, 在此将这种通信模式 称为“有意识”型的。 除了第一种模式的进程间通信外,在实际应用中, 还经常 涉及到第二种模式的进程间通信。在这种模式的进程间通信 中, 通信双方来自完全不同的软件开发方, 由此很难在事先达 成类似第一类型进程间的通信的那种“默契”,数据交换发生 时,通信双方往往没有既成的服务器端, 服务器端完全不知道 客户端进程的存在, 也不清楚客户端要与之实现通信所使用 的某种特定的协议的内容, 服务端只能对符合自己格式和类 型的客户请求作出响应, 在此将这种通信模式称为“无意识” 型的。另外 ,由于WINDOWS 操作系统的进程保护机制, 这种 “无意识”型的进程间通信常常会造成一般保护性错误 ( GPF )。 3 第一种模式的进程间通信的实现 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 对于第一种模式的进程间的通信, 较为成熟的实现方法 主要以下4 种: 1) DDE 方式 2)内存映像方式 3)消息机制(包括应用本地消息和全局消息的方法) 4)磁盘文件方式 4 第二种模式的进程间通信的实现方法 使用的第一种模式的进程间通信的实现方法在大多数情 况下均需要通信双方进程事先达成通信协议, 取得“默契”方 可实现; 另外, 如果存在进程间的数据传递(通过数据地址参 数) , 由由于Window s 操作系统的进程间的保护机制,会造成 执行时发生数据存取的保护性错误( Access Voilaton)。应用 COM (组件对象模型)技术可以在一定程度上解决进程间“无 意识”型通信的问题 ,但是存在如下的缺点: 1)由于不能事先知道客户端究竟会提出那种类型的请 求, COM 服务器所能够提供的服务是较为有限的, 往往不能 很好地满足不同的客户端的不同请求, 这实际造成了一种客 户端必须跟服务器的局面, 对客户端的请求构成了限制, 大大 降低了通信的灵活性; ·58· Microcomputer Applications Vol. 22, No. 12, 2006    学习园地    微型电脑应用   2006 年第22卷第 12 期 �� 白 焰,华北电子大学自动化系,教授,博导,北京 102206作者简介:梁 庚,华北电子大学自动化系,博士研究生,北京 102206   2)由于COM 服务器所提供的服务是既成的,即使客户端 没有提出任何请求, COM 服务器所提供的服务仍要占用系统 资源, 实际上造成了某种程度上的资源浪费。 由此, 在解决 II 型进程间通信的问题时,我们要寻找一种 方法克服以上“无意识”型通信中的几个缺点,该种方法所形 成的实现方式具有如下的特点: 1)由客户端进程驱动, 为服务端进程动态加载服务器, 实 现服务端进程从“无意识”到“有意识”,使得服务器端进程可 以按照客户端的需要提供数据和服务, 实现服务器跟随客户。 2)由客户端时程控制服务端进程服务器的自由卸载, 即 在客户端进程不再需要服务端进程所提供的服务时, 动态却 卸载掉为其动态加载的服务器, 避免资源的浪费。 Windows 操作系统提供的进程可挂钩 ( P ro cess - Hook- able)机制为上述问题的解决提供了一种途径。系统钩子在动 态加载以后就成为各种进程中的一部分, 系统钩子( Hook Function)就可以充当由客户端进程驱动的动态加载到服务 端进程中的“有意识”的通信服务器。 各进程间在WINDOWS 操作系统下存在保护机制, 进程 间不能直接读写数据, 而内存映像机制为系统内各进程间的 数据交换担供了解决方案。 由系统钩子和内存映像机制共同构成的针对第二种模式 的进程间的“有意识”型通信的工作过程为: 1)他方服务端进程启动; 2)已方客户端进行启动; 3)已方客户端进程启动系统挂钩函数, 为他方服务端进 程动态加载“有意识”的进程间通信服务器; 4)已方客户端进程向他方服务端进程中的通信服务器提 出请求, 由通信服务器与他方服务端进程进行进程内通信(如 采用消息机制, 见下列) , 取得他方服务端进程内的数据后, 写 入到他方服务端的内存映像区,然后采用消息机制通知已方 客户端进程数据已经写入内存映像区; 5)已方客户端进程收到来自通信服务器(即钩字函数)的 通知消息后, 到指定的内存映像区提取数据; 6)已方客户端进程动态卸载他方服务端进程中的通信服 务器(系统钩子)。这种进程间“有意识”通信的实现的模式如 图1 所示。 图中: � 已方客户端进程向他方服务端进程中动态加载系统钩 子(通信服务器) , 并向通信服务器提出请求; � 通信服务器向服务端进程内某线请求数据; � 线程向主服务器传递所请求的数据; �通信服务器在服务端进程内创建内存映像区, 并将数 据写入内存映像区; � 通信服务器向已方客户端进程发送通知消息, 告知数 据以写入内存映像区; �已方客户端进程读取他方服务端进程中由通信服务器 创建的内存映像区中的数据; 然后动态即载他方服务端进程 中的通信服务器(系统钩子)。 图1 进程间“有意识”通信的实现模式 这种方法不但克服了COM 服务器进程存在的弱点。实现 了服务器跟随客户。从而大大提高了通信的灵活性, 而且避免 了采用消息机制进行进程间数据传递时造成的保护性错误, 保证了程序运行的可靠性和鲁棒性。 5 应用实例 本文作者在开发多媒体教学 课件 超市陈列培训课件免费下载搭石ppt课件免费下载公安保密教育课件下载病媒生物防治课件 可下载高中数学必修四课件打包下载 系列软件过程中,其中 有一项要求程序实现模拟鼠标拖动桌面图标, 而要达到这个 目的就需要知道桌面上某个图标的具体位置。这显然属于第 二种模式的进程间通信。如果采用消息机制直接向桌面窗口 (该窗口属于 EXPLORER 进程 )发送 LVM _ GETITEM- RECT 消息, 由于存在由地址参数指示的进程间的数据传递, 所以会导致系统的保护性错误。本文作者在采用了本文所述 第二种模式的进程间数据通信的实现方法后, 以VC+ + 6. 0 为开发平台编制程序, 成功地取得了桌面某图标的位置数据, 由此证实了该种方法在解决进程间数据交换中的灵活性和可 靠性。 1)编写系统钩子函数, 在 VC + + 6. 0 下编译为 DLL 文 件: HHOOK hook; int_ declspec( dllexpor t) set myhook( ) { hook = ∷SetWindow sHookEx ( WH _ GET MESSAGE, myhookproc, theApp. m _ hInstance, 0) ; if( ho o= = NULL ) { ∷AfxM essageBox ( "setw indow shook fail" ) ; return- 1; / / - - - - - - - - - - - - - - - - - - - - - > out } / / if ( . . . . ) ·59· Microcomputer Applications Vol. 22, No. 12, 2006    学习园地    微型电脑应用   2006 年第22卷第 12 期 r eturn 0; } vo id_ declspec( dllexpor t) unmyhook( ) { ∷Unhook Window sHookEx ( hook) ; } 下面为钩子函数: HWND hw nd_ listv iew ; Bool fir st_ run= true; LRESULT _ stdcall myhookproc ( int code , WPARAM w param, LPARAM lpar am) { if(∷hwnd_ list view = = NULL ) { HWNDhw nd _ progman = ∷FindW indow ( "pro gm an", NULL ) ; HWNDhw nd _ defview = ∷ FindWindowEx ( hw nd _ progman, NU LL , "SHELLDLL_ DefV iew" , NULL ) ; ∷hw nd_ listv iew = ∷FindW indowEx ( hw nd_ defview, NULL , "Sy sListV iew 32", NULL ) ; if(∷hwnd_ list view = = NULL ) ∷AfxMessageBox ( "无法找到桌面窗口! " ) ; r eturn 0; } / * - - - - - - - - - - - - - - - - * / MSG* p_ msg= ( M SG* ) 1param ; if( code> 0) { if( wpar am= = PM _ REMOVE) { if ( p_ msg - > hwnd= = ∷hw nd_ listv ies&&p _ msg- > message = LVM _ GETIT EMRECR&&∷ first _ run = = true { RECTrect= { 0, 0, 0, 0} ; ∷fir st_ run= false; ∷ SendM essage ( hwnd _ listv iew , LVM _ GET ITEM- RECT , 1, ( LONG) &rect) ; / / - - - - - 下面创建内存映像- - - - - - - - - - - / / if( rect . bottom! = 0) { HANDLE h_ o f_ mapping= ∷CreateFileM apping ( ( HANDLE) - 1, NULL , PAGE_ READWRITE, 0, 100, "shared") ; If( h_ of_ mapping= = 0) r eturn 0; vo id* pdat a= ∷MapV iew OfF ile( h _ of_ m apping , F ILE _ MAP_ ALL_ ACCESS, 0, 0, 0) ; ∷memcpy( pdata, &rect , sizeof( rect) ) ; HWND client _ hw nd= ∷FindWindow ( NULL"多媒体 课件系统软件之 3") ; If( client_ hw nd= = 0) r et urn 0; ∷PostM essage( client _ hw nd, WM _ CANREADNOW, 0, 0) ; } / / if ( rect . bott om! = 0) } / / if ( p_ msg- > hw nd= = ∷hw nd_ listiv eW&&. . . . ) } / / iif( w param = = PM_ REM OVE) } / / if ( code> = 0) LRESULT result = ∷ CallNex tHookEx ( hook, code, wpar am, lparam ) ; return result ; } 2)编写已方客户端进程程序; vo id CM yDlg∷OnOk( ) { / / TODO : Add ex tra v alida tion her e; int r esult= setmyhook( ) ; / /设置系统挂钩 if( result = = - 1) { return; / / - - - - - - > out } ∷Sleep( 500) ; HWND hw nd _ progman= ∷FindWindow ( "pro gman ", NU LL ) ; HWND hw nd _ defv iew = ∷F indW indow Ex ( hw nd _ progman, NULL , "SHELLDLL_ DefV iew " , NULL ) ; HWND hwnd_ listv iew = ∷F indWindow Ex ( hwnd_ de- fv iew , NULL , "SysL istV iew 32" , Null) ; if( hw nd+ listv iew = = NULL ) { this- > MessageBox ( "fail" ) return; / / / - - - - - - - - - - - - > out } ∷ SendMessage ( hw nd _ listv iew , LVM _ GETITEM- RECT , 2( LPARAM ) 0) ; / /注意最后一个参数必须为 0,否则 会发生保护性错误 } 以下为响应他方服务端进程中的通信服务器(系统钩子 函数)发给已方客户端进程的消息的响应函数: LRESULT CMyDlg ∷ On WM _ CANREADNOW (WPARAM w param , LPARAM lparam ) vo id* pdata= ∷OpenF ileMapping ( F ILE_ MAP_ ALL _ ACCESS, O, " shar ed") , / /取得内存映像在本进程中的地 址 ∷ m emcpy ( &rect, pdata, sizeo f ( t his - > m _ IconRect) ) ; / /从存映像中读取数据 unmyhook( ) ; / /动态卸载他方服务端进程中的通信服务 器(系统钩子函数) } (下转第44 页) ·60· Microcomputer Applications Vol. 22, No. 12, 2006    学习园地    微型电脑应用   2006 年第22卷第 12 期 置条件测试和不变量条件测试。契约条件是定义成字符串的 Java 表达式,结果为 tr ue 或False。如果遗漏了测试表达式, 在 执行期该工具仍然会根据上下文使用合理的默认设置。例如, 字段的默认不变条件要求字段不能为空。类似地, 默认的方法 前置条件要求所有非基本的输入参数不能为空, 默认的方法 后置条件要求返回值不能为空。 BankAccount的接口规范包含一个类范围的不变量条件 测试, 即余额总要大于或等于0(对不起,不允许透支)。getBal- ance ( )方法有一个后置条件, 即它必须返回大于或等于 0 的 值。虽然接口不能定义字段, 但不变条件测试和其他测试引用 了一个隐含的余额字段。不过, 因为接口定义了对应的 Jav- aBean 存取器方法,所以仍可以推导出字段的存在。 实例中还有几个前置条件, 包括要求客户传递给Wit h- draw ( )和depo sit( )的参数大于或等于0; withdr aw ( )有额外的 前置条件, 要求取款的数额不能超过现有余额等。 由于契约会影响离散的执行点, 所以本文中把 public、 pro tected 和包可见的方法当成“原子的”。这意味着可以在方 法中临时进行违支测试, 只要在方法完成的时候满足条件即 可。对于带有测试的其他方法或字段的调用也会触发这些测 试, 所以要有一些特殊情况的例外, 以防止方面代码中的无限 制递归之类的问题。目前我们不允许在private 方法上定义测 试, 因为外部客户看这些方法。对静态方法的测试也不支持。 因为它们不影响对象的状态。 字段的不变量条件测试只是在读写字段之后才进行, 以 便允许惰性计算。类似地, 字段的不变条件测试从不在对象构 造期间进行, 但是它们会在构造完成之后进行。 5 小结 基于AOP 实现契约式设计, 也直接编写自己的方面。本 文采用契约子句而没有直接利用 AOP 方面的优热在于没有 AspectJ 经验的开发人员也能使用它 ,只需要对构建过程做简 单的修改即可。本文中的契约利用注解的形式, 仍然是符合 Java 语法的 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 语句,可以方便的翻译为AOP的方面。契约 不仅可以执行, 还是用户可见的代码、文档和信息的组成部 分, 而如果是在分散的方面中捕获到的, 这些信息则会很模 糊。 单元测试 部编版二年级下册第二单元测试题部编版二年级下册第二单元测试卷部编版二年级下册第二单元测试部编版二年级下册语文第二单元测试卷人教版七年级下册英语单元测试卷 和契约式设计用不同的方式实现类似的目标。 而本文所介绍的契约式设计工具在单元测试比较分散或比较 困难的时候最有帮助。集成和内置测试,有助于捕获这些经常 被更低级的测试忽略的模糊的集成问题。 参考文献: [ 1] Dean Wampler . The Challenges of W riting Por table and Reusable Aspect s in Aspects in AspectJ [ A ] : L essons fr om Contract 4J. AOSD , ACM , 2006[ C] . [ 2] A spect J Homepage [ EB/ OL ] . http: / / w ww . eclipse. o rg / aspectj/ do c/ nex t/ pro gguide/ star ting- development . html [ 3] Ber tr and Meyer . Object- O rient ed So ftw are Const ruction [ M ] . Second Edition P rentice Hall, 1997 [ 4] Contract 4J Homepage [ EB/ OL ] . http: / / ww w . contr act4j. or g [ 5] Getting Start ed with the Anno tation P rocessing T ool[ EB/ OL ] . httpL / / java . sun. com/ j2se/ 1. 5. 0/ docs/ guide/ apt/ GettingStart ed. ht ml [ 6] Ga ry T . Leavens and Yoonsik Cheon. Design by Contract w ith JM L [ J ] . Manuscr ipt KRML 156, 30 September 2005. [ 7] Joseph D. Gradecki, N icholas Lesiecki著;王欣轩, 吴东升 等译. 精通 AspectJ[ M ] . w iley Publishing Inc, 2003; 清华 大学出版社, 2005. P25- P44 [ 8] http: / / jakart a. apache. or g / commons/ jex l/ [ 9] Y Cheon, GT Leavens. A simle and practical appro ach to unit testing ; The JML and JU nit w ay [ A ] . ECOOP . 2002 - Springer [ C] . [ 10] James Gosling , Bill Joy , Guy St eele, Gilad Bracha Java Language Specificaton, the 3rd Edition[ M ] . Addison - Wesley Pro fessional, June 14, 2005. P270- P28 (收稿日期: 2006- 9- 15) (上接第60 页) 6 结论 本文定义WINDOWS 系统下各类进程间通信的两种模 式, 本文概括了第一种模式的进程间通信所使用的三种方案, 并在此基础上针对第二种模式的进程间通信的特点提出了一 种具体实用的实现方案, 在保证了应用程序的健壮性和可靠 性的同时大大提高了通信的灵活性, 在很大程度上弥补了第 一种模式的进程间通信的传统的实现方法上不足。在实际应 用中, 将两种模式的进程间通信的实现方法结合起来加以应 用, 即可实现各类进程间的数据交换。 参考文献: [ 1]新编WINDOWS API 参考大全编写组.新编WINDOWS API参考大全[ M ] . 北京:电子工业出版社, 2000 [ 2]齐舒创作室. VC+ + 6. 0 开发技巧与实例剖析[ M ] . 北京: 清华大学出版社, 1999 [ 3] David Bennet 著. 徐军译. VC+ + 5 开发人员指南[ M ] . 北 京:机械工业出版社, 1998 [ 4]肖红伟. VC+ + 6. 0 编程实效百例 [ M ] .北京:人民邮电出 版社, 2002 [ 5]高丽华. 多媒体CAI课件的开发过程及方法研究[ J] . 微型 电脑应用, 2000 Vo l1. 16 No . 1 (收稿日期: 2006- 6- 8) ·44· Microcomputer Applications Vol. 22, No. 12, 2006    技术交流    微型电脑应用   2006 年第22卷第 12 期
本文档为【Windows下进程间通信方式探讨】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_131926
暂无简介~
格式:pdf
大小:987KB
软件:PDF阅读器
页数:5
分类:互联网
上传时间:2012-04-09
浏览量:28