DLL共享数据段,实现多进程数据共享总结
前段时间一直用WM_COPYDATA消息实现进程数据通信,这次软件升级想学习一下,DLL共享数据段应用,因为这个比共享内存简单一些,向VCKBASE前辈请教了很多,最后明白了下面的点滴
问题简述
假想通过DLL实现进程数据共享?
实现
第一步:在DLL的.CPP文件中定义共享数据段
#pragma data_seg("SHARED_OPCDATASET")
/* volatile */ OPCDATASET m_gOPCDATASET[OPCDATASET_MAX_LEN] = {0};
#pragma data_seg()
#pragma comment(linker,"/SECTION:SHARED_OPCDATASET,RWS")
/*
如果没有初始化可尝试执行下面的操作
_declspec(allocate("SHARED_OPCDATASET")) OPCDATASET m_gOPCDATASET[OPCDATASET_MAX_LEN];
*/
第二步:将共享段变量导出
extern "C"
{
//导出共享段变量
OPCDATASET_API OPCDATASET extern m_gOPCDATASET[OPCDATASET_MAX_LEN];
}
第三步:在不同进程中调用
#include "OPCDataSet.h"
#pragma comment(lib, "COPCDataSet.lib")
//A进程: 向共享段写数据
char OPCDataBuffer[56] = {0};
m_gOPCDATASET[0].dVal = FormatVarVal(pVar, OPCDataBuffer);
FILE * fp = fopen("d:\\Set.txt", "a");
fprintf(fp, "%f", m_gOPCDATASET[0].dVal);
fclose(fp);
//B进程: 从共享段读数据
FILE * fp = fopen("D:\\get.txt", "a");
fprintf(fp, "%f", m_gOPCDATASET[0].dVal);
fclose(fp);
注:这些进程最好是与你的DLL放于同一目录下,或将你的DLL放入system32目录下
精彩指导选编:
回复人: vc_student (进士) 2009-8-19 9:45:56
可以通过dll导出一个函数专门操作共享内存呀!
只有一个进程对这个空间进行写操作,其它多个进程是只读,还用做同步吗?
回复人: vc_student (进士) 2009-8-19 9:50:28
要不写到一半别人去读怎么办?
回复人: 幸福的鬼 (书童) 2009-8-19 10:03:57
同步处理是肯定要的,但是关键代码段是不能跨进程的!!!
回复人: vc_student (进士) 2009-8-19 10:04:29
哈,想起来了,关键代码段好像不支持多进程?
回复人: vc_student (进士) 2009-8-19 10:09:46
可以使用互斥对象和事件对象
回复人: folklore (进士) 2009-8-19 10:34:26
因为你根本就没有真正共享,要真的共享,请使用Mmap,谢 谢
回复人: 幸福的鬼 (书童) 2009-8-19 10:39:59
这样的软件设计,强
对共享段的访问应该封装在DLL内部,才是比较好的设计
分享到:
相关推荐
下面这个模块是我使用易语言时写补丁最常用的一个模块(当然很多也是抄的),一开始我觉得bug肯定会很多,放出去肯定又会坑很多人,后来我发现坑坑更健康,当你明白一个东西的优缺点之后,你才会更好的选择你所需要...
Windows PE文件中设置共享变量 ...但是在共享数据段内的变量必须初始化,如上面的A_Public_Number=0;如果没有初始 化,即使段的属性是共有共享的,但是这个变量却是私有的。...............................
主要在MzfHipsDlg中,程序分析进程数据、驱动数据、注册表数据从而实现主动防御。 超级下载 不过不是c++源码 1:综合FTP下载和HTTP(网络蚂蚁)(多线程). 2:FTP下载支持多个站点同时下载一个文件(同时支持断点续传). 3...
当在整个进程空间中需要且只需要一个这些数据的实例时,这样的静态数据标记就不适合了,为了解决这个问题,必须实现数据共享。为此得把数据放入一个特定的段地址中,然后将它们标记为共享。实现代码如下: #pragma ...
15.2.2 实例:多线程环境下的数据共享 278 15.3 内核对象与等待函数 280 15.3.1 内核对象 280 15.3.2 等待函数 281 15.4 事件内核对象 283 15.4.1 基本原理 283 15.4.2 实例:使用事件内核对象示例 284 15.5...
15.2.2 实例:多线程环境下的数据共享 278 15.3 内核对象与等待函数 280 15.3.1 内核对象 280 15.3.2 等待函数 281 15.4 事件内核对象 283 15.4.1 基本原理 283 15.4.2 实例:使用事件内核对象示例 284 15.5...
总结:windows进程所需要的动态库文件都是以写入时拷贝的方式映射到进程地址空间中的。这样,我们只能拦截指定的进程。修改目标进程地址空间中的指定api的入口和出口地址之间的任意数据,使之跳转到我们的拦截代码中...
检查与进程、线程和作业相关的数据结构和算法;观察Windows如何管理虚拟内存和物理内存;理解NTFS的操作和格式,诊断文件系统访问问题;从上往下查看Windows的网络栈,包括映射、API、名称解析和协议驱动程序;诊断...
数据类型 进程数据, 公开, 进程信息数据 .成员 结构大小, 整数型, , , 1024 .成员 进程的引用计数, 整数型 .成员 进程ID, 整数型 .成员 进程默认堆ID, 整数型 .成员 进程模块ID, 整数型 .成员 线程数, 整数型 ...
但是,所有的服务器都使用一种数据库格式,因此,你可以很方便的在不同的引擎之间共享数据库文件的数据。 协议: Firebird协议使用IPL(interbase public license)和IDPL(Initial Developer's Public License),这种...
6-2 VER 1.3.0.63 增强了同一脚本程序的多脚本语言功能,真正实现了同一脚本里使用多种语言 增加例程 javascript学习.sps 演示了VBS调用JS的函数并得到返回值 修正了多语言脚本的Code代码段读取分析...
ASP.Net应用程序的多进程模型 NET委托:一个C#睡前故事 [推荐] - [原创] Microsoft .NET策略及框架概述 卸载Class? Web Form 窗体 如何实现web页面的提示保存功能 在ASP.Net中两种利用CSS实现多界面的方法 如何在...
15.4 接口的实现 .182 15.5 抽象类与接口 .195 15.6 小 结 .196 第十六章 组织应用程序 .198 16.1 基 本 概 念 .198 16.2 使用名字空间 .200 16.3 使用指示符 .203 16.4 程 序 示 例 .206 16.5 小 ...
2.12 将二进制数据发送到Windows的标准输出 77 2.13 使用C++的类iostream语法 78 2.14 回退输入文件到起点 80 2.15 用类文件对象适配真实文件对象 83 2.16 遍历目录树 84 2.17 在目录树中改变文件扩展名 85 ...
这是个J2ME控制台程序,它能剔除PNG文件中的非关键数据段,减少文件大小从而达到压缩图片的目的。而图片的质量并不会受到损失。使用时候只需在控制台窗口执行jar就可以了。 Java 3DMenu 界面源码 5个目标文件 ...
静态编译后的易语言EXE/DLL之间不能再共享譬如窗口、窗口组件等类似资源,对于已经静态连接到一个EXE/DLL中的支持库,该支持库中的数据或资源将不能再被其它EXE/DLL中所使用的同名支持库访问。这是因为代码被分别...
说明 : 指定在一个共享服务器环境中可同时运行的共享服务器进程的最大数量。 值范围: 根据操作系统而定。 默认值 : 20 dispatchers: 说明 : 为设置使用共享服务器的共享环境而设置调度程序的数量和类型。可以为该...
27 <br>0056 强行改变运算符的运算顺序 27 <br>第3章 程序算法 29 <br>3.1 数据结构 30 <br>0057 如何实现单向链表 30 <br>0058 如何实现双向链表 35 <br>0059 如何实现堆栈 41 ...
这是个J2ME控制台程序,它能剔除PNG文件中的非关键数据段,减少文件大小从而达到压缩图片的目的。而图片的质量并不会受到损失。使用时候只需在控制台窗口执行jar就可以了。 Java 3DMenu 界面源码 5个目标文件 ...