进程间通信-动态链接库实现

进程间通信-动态链接库实现

ID:12435231

大小:448.50 KB

页数:8页

时间:2018-07-17

进程间通信-动态链接库实现_第1页
进程间通信-动态链接库实现_第2页
进程间通信-动态链接库实现_第3页
进程间通信-动态链接库实现_第4页
进程间通信-动态链接库实现_第5页
资源描述:

《进程间通信-动态链接库实现》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、以前介绍的几种用于实现进程之间通信的方法都是比较正统的方式,像剪贴板,命名管道这些都还是用得比较多的,而这里将介绍的是一种比较偏门的方法来实现进程间的通信,所谓偏门呢,自然就是用的少,能够不用就不要使用。其实这种方法就是通过动态链接库来实现进程间的通信。动态链接库(DLL)概述既然是要通过动态链接库来实现进程间的通信,那么这里如果不来介绍一下动态链接库的话,怎么也说不过去的。动态链接库是Windows操作系统的基础,其中WindowsAPI基本上都是以动态链接库的形式来提供的,通常来说动态链接库是不能够直接

2、运行,也不能够直接接受消息的,它们是一些独立的文件(后缀名一般为.dll,当然还有其他的一些后缀名也是可以的),其中包含能被可执行程序或其他DLL调用来完成某项工作的函数,也就是说动态链接库也就是由一些函数组成而已。并且只有在其他模块调用动态链接库中的函数时,动态链接库才发挥作用,在实际的编程中,通常可以把完成某种功能的函数放在一个动态链接库中,然后提供给其他函数调用。当这个访问了动态链接库的进程被加载时,系统会为这个进程分配4GB的私有地址空间,然后系统就会分析这个可执行模块,找到这个可执行模块中所调用的

3、DLL,然后系统就负责搜索这些DLL,找到这些DLL后便将这些DLL加载到内存中,并为它们分配虚拟的内存空间,最后将DLL的页面映射到调用进程的地址空间中,DLL的虚拟内存有代码页和数据页,它们被分别映射到进程A的代码页面和数据页面,如果这时进程B也启动了,并且进程B也需要访问该DLL,这时,只需要将该DLL在虚拟内存中的代码页面和数据页面映射到第二个进程的地址空间即可。这也表明了在内存中,只需要存在一份DLL的代码和数据,多个进程共享DLL的同一份代码,很明显这样做可以节省内存空间的。但是在Windows

4、下,由于系统会为每一个进程分配4GB的私有地址空间,而DLL中的代码和数据也只是映射到了这个私有地址空间中,所以这些应用程序之间还是不能够相互影响的,也就是说多个应用程序虽然是可以共享同一个DLL中的相同的代码的,但是DLL为每一个进程保存的数据都是不相同的,并且每一个进程都为DLL使用的全部数据分配了自己的地址空间,举个最简单的例子,我的DLL中有一个函数为intAdd(intnum1,intnum2),这个函数的作用是实现num1和num2相加并返回相加后的结果。然后我有一个进程A使用了这个DLL,并且

5、其调用了函数Add(10,20),然后我还有一个进程B其也使用了这个DLL,并且其调用了函数Add(30,40),那么对于进程A中的数据10和20其实是保存在进程A的私有地址空间中的,而对于进程B中的数据30和40则是保存在进程B的私有地址空间中的,上面这个简单的例子表明如果单单用这种简单的使用动态链接库的方式是不能够实现进程之间的通信的。动态链接库中共享内存的实现如果想利用动态链接库来实现进程间的通信的话,那么有一种方案可以试一试,即从系统为动态链接库分配的那一块内存(系统需要将动态链接库加载到内存中)下

6、手,由于在内存中,动态链接库其实只存在一份,其被所有需要调用该动态链接库中的函数的模块或者简单说是可执行程序所共享,既然是共享的话,如果我在系统给动态链接库分配的这块内存中保存数据,那岂不是可以被所有访问该动态链接库的可执行程序所获取或者说设置。这样的话,我就可以使用进程A来设置好这个共享内存中的数据,然后进程B就可以读取这个共享内存中的数据了,这不是也可以实现进程间的通信嘛,这样看来的话,其思路其实和使用剪贴板是一模一样的了。也是采用一块两个进程共享的内存来作为存放数据的中介。示例:动态链接库实现进程间通

7、信共享DLL实现:新建动态链接库项目步骤:项目结构://ShareDLL.h#ifndefSHARED_DLL#defineSHARED_DLL//在DLL项目中设置DLL_API为导出类型extern"C"_declspec(dllimport)//在Test项目中则无需设置该DLL_API,直接使用这个CalculateDLL.h文件即可#ifdefDLL_API#else#defineDLL_APIextern"C"_declspec(dllimport)#endifDLL_APIvoidSetDat

8、a(inttmpData);DLL_APIintGetData();#endifDLL.cpp//DLL.cpp:定义DLL应用程序的导出函数。#include"stdafx.h"#defineDLL_APIextern"C"_declspec(dllexport)#include"ShareDLL.h"//使用#pragmadata_seg()来表明这一段数据为共享数据//一定要注意给下面的变量初始化,否则将无

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。