




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
以前介绍的几种用于实现进程之间通信的方法都是比较正统的方式,像剪贴板,命名管道这些都还是用得比较多的,而这里将介绍的是一种比较偏门的方法来实现进程间的通信,所谓偏门呢,自然就是用的少,能够不用就不要使用。其实这种方法就是通过动态链接库来实现进程间的通信。 动态链接库(DLL)概述 既然是要通过动态链接库来实现进程间的通信,那么这里如果不来介绍一下动态链接库的话,怎么也说不过去的。动态链接库是 Windows 操作系统的基础,其中 Windows API 基本上都是以动态链接库的形式来提供的,通常来说动态链接库是不能够直接运行,也不能够直接接受消息的,它们是一些独立的文件(后缀名一般为 .dll ,当然还有其他的一些后缀名也是可以的),其中包含能被可执行程序或其他 DLL 调用来完成某项工作的函数,也就是说动态链接库也就是由一些函数组成而已。并且只有在其他模块调用动态链接库中的函数时,动态链接库才发挥作用,在实际的编程中,通常可以把完成某种功能的函数放在一个动态链接库中,然后提供给其他函数调用。当这个访问了动态链接库的进程被加载时,系统会为这个进程分配 4GB 的私有地址空间,然后系统就会分析这个可执行模块,找到这个可执行模块中所调用的 DLL ,然后系统就负责搜索这些 DLL ,找到这些 DLL 后便将这些 DLL 加载到内存中,并为它们分配虚拟的内存空间,最后将DLL 的页面映射到调用进程的地址空间中,DLL 的虚拟内存有代码页和数据页,它们被分别映射到 进程 A 的代码页面和数据页面,如果这时 进程B也启动了,并且进程B也需要访问该DLL,这时,只需要将该 DLL 在虚拟内存中的代码页面和数据页面映射到第二个进程的地址空间即可。这也表明了在内存中,只需要存在一份 DLL 的代码和数据,多个进程共享 DLL 的同一份代码,很明显这样做可以节省内存空间的。但是在 Windows 下,由于系统会为每一个进程分配 4GB 的私有地址空间, 而 DLL 中的代码和数据也只是映射到了这个私有地址空间中,所以这些应用程序之间还是不能够相互影响的, 也就是说多个应用程序虽然是可以共享同一个 DLL 中的相同的代码的,但是 DLL 为每一个进程保存的数据都是不相同的,并且每一个进程都为 DLL 使用的全部数据分配了自己的地址空间,举个最简单的例子,我的 DLL 中有一个函数为 int Add(int num1,int num2),这个函数的作用是实现 num1 和 num2 相加并返回相加后的结果。然后我有一个 进程 A 使用了这个 DLL ,并且其调用了函数 Add(10,20),然后我还有一个进程B 其也使用了这个 DLL ,并且其调用了函数 Add(30,40),那么对于 进程A 中的数据 10 和 20 其实是保存在 进程 A 的私有地址空间中的,而对于进程 B 中的数据30 和 40 则是保存在进程 B 的私有地址空间中的,上面这个简单的例子表明如果单单用这种简单的使用动态链接库的方式是不能够实现进程之间的通信的。 动态链接库中共享内存的实现 如果想利用动态链接库来实现进程间的通信的话,那么有一种方案可以试一试,即从系统为动态链接库分配的那一块内存(系统需要将动态链接库加载到内存中)下手,由于在内存中,动态链接库其实只存在一份,其被所有需要调用该动态链接库中的函数的模块或者简单说是可执行程序所共享,既然是共享的话,如果我在系统给动态链接库分配的这块内存中保存数据,那岂不是可以被所有访问该动态链接库的可执行程序所获取或者说设置。这样的话,我就可以使用 进程 A 来设置好这个共享内存中的数据,然后进程 B 就可以读取这个共享内存中的数据了,这不是也可以实现进程间的通信嘛,这样看来的话,其思路其实和使用剪贴板是一模一样的了。也是采用一块两个进程共享的内存来作为存放数据的中介。 示例:动态链接库实现进程间通信共享 DLL 实现:新建动态链接库项目步骤:项目结构:/ShareDLL.h#ifndef SHARED_DLL#define SHARED_DLL /在 DLL 项目中设置 DLL_API 为导出类型 extern C _declspec(dllimport)/在 Test 项目中则无需设置该 DLL_API , 直接使用这个 CalculateDLL.h 文件即可 #ifdef DLL_API#else #define DLL_API extern C _declspec(dllimport)#endif DLL_API void SetData(int tmpData);DLL_API int GetData();#endifDLL.cpp/ DLL.cpp : 定义 DLL 应用程序的导出函数。#include stdafx.h#define DLL_API extern C _declspec(dllexport)#include ShareDLL.h /使用 #pragma data_seg() 来表明这一段数据为共享数据/一定要注意给下面的变量初始化,否则将无法实现数据在多个进程间共 享#pragma data_seg(SharedDataInDll) /初始化为 0 int data = 0; #pragma data_seg() /这里还需要告诉链接器表明 SharedDataInDll 数据段为可读可写可共享#pragma comment(linker, /SECTION:SharedDataInDll,RWS) /返回共享数据int GetData() return data; /设置共享数据void SetData(int tmpData) data = tmpData;进程 A 实现:(简单 Console 程序)项目结构:/ShareDLL.h#ifndef SHARED_DLL#define SHARED_DLL /在 DLL 项目中设置 DLL_API 为导出类型 extern C _declspec(dllimport)/在 Test 项目中则无需设置该 DLL_API , 直接使用这个 CalculateDLL.h 文件即可 #ifdef DLL_API#else #define DLL_API extern C _declspec(dllimport)#endif DLL_API void SetData(int tmpData);DLL_API int GetData();#endifDLLProcessA.cpp #include #include ShareDLL.husing namespace std; /引用 DLL.lib 引入库#pragma comment(lib, DLL.lib) int main(int argc, char * argv) int data; coutdata; /设置共享内存 SetData(data); coutendlendl; system(pause); /读取共享内存 cout进程 A 读取数据: GetData()endlendl; system(pause);进程 B 实现:(简单 Console 程序)项目结构:/ShareDLL.h#ifndef SHARED_DLL#define SHARED_DLL /在 DLL 项目中设置 DLL_API 为导出类型 extern C _declspec(dllimport)/在 Test 项目中则无需设置该 DLL_API , 直接使用这个 CalculateDLL.h 文件即可 #ifdef DLL_API#else #define DLL_API extern C _declspec(dllimport)#endif DLL_API void SetData(int tmpData);DLL_API int GetData();#endifDLLProcessB.cpp#include #include ShareDLL.husing namespace std; /引用 DLL.lib 引入库#pragma comment(lib, DLL.lib) int main(int argc, char * argv) int data; /读取共享数据 cout进程 B 读取数据: GetData()endlendl; coutdata; /设置共享数据 SetData(data); coutendlendl; system(pause); 需要将 DLL 项目中的 DLL.dll 和 DLL.lib 两个文件,分别拷贝到项目 DLLProcessA 和 DLLProcessB 的根目录下。然后分别编译 DLLProcessA 和 DLLProcessB 两个项目,最后将 Dll.dll 和DLL.lib 以及 DLLProcesA.exe 和 DLLProcessB.exe 拷贝到同一目录下面,比如:(这样可以确保两个进程访问到的是同一个动态链接库)效果展示:首先运行 DLLProcessA.exe 文件并设置共享数据为 8 :然后启动 DLLProcessB . exe 文件(可以看出其读出的值为 8 ):然后再在 DLLProcessB.exe 中设置数据为 16 :然后再在 DLLProcessA . exe 中按下回车键(此时可以看到进程
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025福建三明清流县金星园建设发展有限公司招聘消防员2人模拟试卷及一套答案详解
- 2025湖南省中南林业科技大学第一批招聘21人考前自测高频考点模拟试题及一套参考答案详解
- 2025福建省康辉国际旅行社股份有限公司招聘5人模拟试卷附答案详解
- 2025贵阳农商银行“超享聘·旭日计划”大学生招聘20人模拟试卷及完整答案详解
- 2025年河北沧州泊头市中医医院招聘专业技术人员29名考前自测高频考点模拟试题附答案详解(完整版)
- 2025辽宁抚顺新抚钢有限责任公司招聘拟聘用人员模拟试卷参考答案详解
- 2025金华市技师学院公开招聘高层次人才2人模拟试卷及答案详解(各地真题)
- 2025年长江工程职业技术学院人才引进24人模拟试卷及答案详解1套
- 2025年南安市部分公办学校专项招聘编制内新任教师58人(二)考前自测高频考点模拟试题及答案详解(历年真题)
- 2025福建亿力集团有限公司所属单位校园招聘98人模拟试卷参考答案详解
- 监理整改措施方案(3篇)
- 景区酒店融资方案(3篇)
- GB/T 9948-2025石化和化工装置用无缝钢管
- 下肢静脉血栓疑难病例护理讨论
- 农行柔性团队管理办法
- 预防性维护与预测分析
- 重心的讲课课件
- DB42∕T 2221-2024 预制芯桩复合桩技术规程
- 抗癫痫类药讲课件
- 2025三年级科学教学质量提升计划
- 飞行器维修技术专业教学标准(高等职业教育专科)2025修订
评论
0/150
提交评论