dll实现进程通信_注入dll后如何和进程通信-程序员宅基地

技术标签: cstring  

3.6.2  使用DLL通信的方法
从上面可以看出,对于Win32的DLL,所有载入DLL的应用程序只能共享程序代码,不能共享数据,必须要采取一种方法才能使这些程序之间共享数据。当然访问数据时要注意同步问题。
要想使Win32 DLL的数据区能设计成共享的存储区,可以通过#pragma
data_seg指令建立一个新段来做到这一点,实际上是告诉编译器包含段中的特定变量。然而,仅此不足以做到数据共享,还必须把段中将要共享的变量告诉连接器。可通过如下命令来
  实现:
(1)指定DEF文件在SECTIONS段下的名字,如下所示:
SECTIONS
    共享段名 READ WRITE SHARED
(2)#pragma comment(linker,"/SECTION: 共享段名,RWS")
下面的例子示范了如何初始化一个全局变量:
#pragma data_seg("MyShared")
UINT m_glnData=0;
#pragma data_seg()
#pragma comment(linker,"/SECTION:MyShared,RWS")
注意要初始化变量。初始化变量很重要,因为编译器将把所有未初始化数据存放在.bss段。把变量安排在与用户预期不同的段中,则它们就不能被共享,除非明确地指出要共享的是.bss段。
关于共享数据段名称MyShared,完全可以用其他的名称,如MYDATA、.MYSC等,但建议不要与PE文件的固定的段名相同,以免程序运行时出错。
最后一点要强调的是,进行通信的程序要使用同一个DLL文件。如果使用的是相同DLL文件的不同副本,则不能实现进程之间的通信。
3.6.3  使用DLL通信的实例
与前面所讲的通信方法不同,本实例使用DLL实现进程间的通信。以下是一个用于生成DLL文件的头文件DllObj.h。其具体代码如下:
// DllObj.h:头文件
//
#ifndef _DLLOBJ_H_INCLUDED
#define _DLLOBJ_H_INCLUDED
#include <afxmt.h>
#ifdef _cplusplus
#define _DLLCOM_ extern "C" _declspec (dllexport)
#else
#define _DLLCOM_ _declspec (dllexport)
#endif
_DLLCOM_LPSTR GetValueString();
_DLLCOM_void SetValueString(LPCSTR str);
#endif
其中SetValueString()和GetValueString()函数分别用于向所指定的共享存储区里写入和读取字符串。_DLLCOM_
用于定义DLL中函数的输出。可以看出,SetValueString()和GetValueString()函数的写法与其他DLL文件的写法没有什么不同。但是,这两个函数所用到的共用字符串变量m_strString的表示方法则是用DLL实现内存数据共享的关键。
现在来看看如何制作一个这样的DLL文件。先用MFCAppWizard(dll)生成一个dllcom
模板(可以取其他的名称),然后把以下的代码包含在一个dllcom.cpp文件中,再用VC++编译器进行编译和连接,就可以生成dllcom.dll和dllcom.lib文件。生成这个DLL文件的核心代码如下:
#pragma data_seg("MyShared")
char m_strString[256]=TEXT("");
volatile bool bInCriticalSection=FALSE;
#pragma data_seg()
#pragma comment(linker,"/SECTION:MyShared,RWS")
CCriticalSection cs;
// 从内存中读取字符串
_DLLCOM_ LPSTR GetValueString()
{
   while(bInCriticalSection) // 等待
       Sleep(1);
    returnm_strString;
}
// 把字符串存储到共享内存中
_DLLCOM_  void SetValueString(LPCSTR str)
{
   while(bInCriticalSection) // 等待
       Sleep(1);
   cs.Lock();
   bInCriticalSection = TRUE;
   strcpy(m_strString,str);
   bInCriticalSection = FALSE;
   cs.Unlock();
}
其中bInCriticalSection为进程访问数据时的同步标识。
在制作了一个用于进程间通信的DLL文件后,就可以利用它实现进程之间的通信。可以设计两个应用程序,dlluser1和dlluser2,在这两个程序中把动态库文件头DllObj.h和动态库dllcom.lib包含其中,即
#include "DllObj.h"
#pragma comment(lib,"dllcom.lib")
然后,用MFCVC++编译器进行编译和连接,这样就可以用SetValueString()和GetValue-String()函数进行通信了。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/shixin_0125/article/details/42554719

智能推荐

navicat for mysql mac中文版_Navicat for MySQL Mac 版常用功能-程序员宅基地

文章浏览阅读1.1k次。Navicat for MySQL Mac 是一套管理和开发 MySQL 的理想解决方案,支持单一程序。这个功能齐备的前端软件为数据库管理、开发和维护提供了直观而强大的图形界面,给 MySQL 新手以及专业人士提供了一组全面的工具。主要功能包括 SQL 创建工具或编辑器、数据模型工具、数据传输、导入或导出、数据或结构同步等。SQL 创建工具Navicat SQL 创建工具视觉化 SQL 创建工具创..._navicat for mysql mac

endnote x9 word 闪退_endnote闪退-程序员宅基地

文章浏览阅读1.5w次,点赞2次,收藏2次。endnote x9 word 闪退https://support.clarivate.com/Endnote/s/article/EndNote-Problematic-field-codes-causing-jumping-cursor-the-range-cannot-be-deleted-or-other-problems-while-formatting?language=en_US..._endnote闪退

讲解数字签名,数字证书,验证码,信息摘要,以及java怎么产生一个数字证书的好文章...-程序员宅基地

文章浏览阅读195次。文章的源地址:[url]http://blog.sina.com.cn/s/blog_5a6e84190100anjm.html[/url]摘要:  在本文中,我用详细的语言和大量的图片及完整的程序源码向你展示了在 JAVA中如何实现通过消息摘要、消息验证码达到安全通信、以及用Java的工具生成数字证书,和用程序给数字证书签名、以及用签名后的数学证书签名applet突破applet..._java 国密数字证书签名不算摘要怎么办

oracle 31693,关于Impdp中ORA-31693 ORA-29913解决方案-程序员宅基地

文章浏览阅读2.9k次。Oracle11gR2 11.2.0.1 + AIX6.1 + RAC将一张表从RAC导出,导入另一单点数据库,导入的过程中出错:cargo03:oracle$ impdp system/cdasdfparfile='/oracle/dp/t_shark_agent.prm'Import: Release 11.2.0.1.0 - Production onWed Aug 24 16:38:46 ..._ora-31693 ora-29913 ora-14400

java字符串转时间戳_java String转为时间戳(long类型)-程序员宅基地

文章浏览阅读2.8k次。从网上找了半天,很多人都是抄袭别人,而且还不正确,相当气愤!下面是我修改后正确的把String类型转为事件戳的方法:public long getTimestamp(String sTime) throws ParseException{System.out.println(sTime);Timestamp ts = Timestamp.valueOf(sTime);Date date2 = ne..._string类型时间如何转化为long类型的时间戳

怎样申请域名SSL证书?_ssl证书 按一级域名申请-程序员宅基地

文章浏览阅读1k次,点赞10次,收藏7次。SSL证书是这种ca证书,遵循SSL协议书,由受信赖的ca证书授予组织CA,在认证网络服务器真实身份后授予,具备网络服务器身份认证和传输数据数据加密作用。在其中SSL协议书就是指SSL/TLS,SSL(Secure Sockets Layer),以及继任传输层安全性(Transport Layer Security,TLS)是为通信网络出示安全性及数据完整性的这种安全协议。TLS与SSL在传输层对数据连接开展数据加密。而SSL证书根据在手机客户端电脑浏览器和Web集群服务器创建这条SSL安全出口(Secur_ssl证书 按一级域名申请

随便推点

jmeter性能测试实战——基础篇_unrecognized vm option 'maxmetaspacesize=400m-程序员宅基地

文章浏览阅读1.1w次,点赞3次,收藏52次。一、下载jmeter安装包官网下载:https://jmeter.apache.org/download_jmeter.cgi配置插件:plugins manager 【参考网站:https://jmeter-plugins.org/install/Install/】把jar包放入你的JMeter根目录下的 lib/ext 目录运行jmeter,在选项中即可看到插件管理工具二、分布式..._unrecognized vm option 'maxmetaspacesize=400m

Python 、Smtp 发送邮件(163邮箱)_to adder-程序员宅基地

文章浏览阅读1.4k次。1、环境 window python 32 、使用 smtplib 库、 MIMEText 库3、 163 邮箱开启授权设置 #!/usr/bin/python#coding:utf-8import smtplibfrom email.mime.text import MIMETextdef sendmail(content): form_add..._to adder

element ui表单必填_vue+element-Ui实现简单的表单必填项验证(1)-程序员宅基地

文章浏览阅读2.8k次。在项目中,通常我们在提交表单的时候需要进行一个必填项的验证,在这里,就简单的介绍一下element提供的表单组件中的必填项验证通过阅读文档,可以得知el-form上是自带一个validate方法的对整个表单进行校验的方法,参数为一个回调函数。该回调函数会在校验结束后被调用,并传入两个参数:是否校验成功和未通过校验的字段。若不传入回调函数,则会返回一个 promise一、首先,我们要调用el-for..._element的表单如何监听必填校验

HTML5 学习总结(四)——canvas绘图、WebGL、SVG-程序员宅基地

文章浏览阅读238次。一、Canvascanvas是HTML5中新增一个HTML5标签与操作canvas的javascript API,它可以实现在网页中完成动态的2D与3D图像技术。<canvas> 标记和 SVG以及 VML 之间的一个重要的不同是,<canvas> 有一个基于 JavaScript 的绘图 API,而 SVG 和 VML 使用一..._根据html字符串,动态解析dom并动态绘制canvas,最后通过绘制好的canvas生成图片

JAVA开发功能实现:把PDF玩儿出花样,IText值得安利一下_itext 能做什么-程序员宅基地

文章浏览阅读769次。IText是什么?iText 7 Core可以被Java或.NET(C#)对PDF文档进行编程。iText是一个通用的、可编程的和企业级的PDF解决方案,允许你将其功能嵌入到你自己的软件中,以实现数字化转型。iText 7 Core以开放源码(AGPL)以及商业许可的形式提供。虽然是开源但是也不代表完全免费,详情可搜索“AGPL协议”。iText 7 Core (open source) pdf2Data* (closed source) pdfCalligraph (closed so_itext 能做什么

数据库的创建表时,字段的数据类型和约束条件_建表时约束int大小-程序员宅基地

文章浏览阅读1.1w次,点赞5次,收藏48次。文章目录数值类型:整数类型:浮点型:日期类型:字符串类型:枚举类型与集合类型:数值类型:整数类型: tinyint 默认有符号,[unsigned]代表无符号,超出范围显示最大范围。语法:tinyint[(m)] [unsigned] [zerofill] int类型无符号的存储宽度4个字节, 创建表整形类型不指定宽度。指定宽度对存储宽度没用,只是更改显示宽度。显示宽度是指..._建表时约束int大小

推荐文章

热门文章

相关标签