DLL共享数据段

不同程序通过DLL通信的实例 通过使用共享数据段,几个程序可以借助DLL互相通信,完成一致性 立即下载

在主文件中,用#pragma data_seg建立一

个新的数据段并定义共享数据,其具体格式为:

 #pragma data_seg ("shareddata") //名称可以

                       //自己定义,但必须与下面的一致。

HWND sharedwnd=NULL;//共享数据

#pragma data_seg()

                     

 

     仅定义一个数据段还不能达到共享数据的目的,还要告诉编译器该段的属性,有两种方法可以实现该目的 (其效果是相同的),一种方法是在.DEF文件中加入如下语句: SETCTIONS shareddata READ WRITE SHARED 另一种方法是在项目设置链接选项(Project Setting --〉Link)中加入如下语句: /SECTION:shareddata,rws

第一点:什么是共享数据段?为什么要用共享数据段??它有什么用途??
        
在Win16环境中,DLL的全局数据对每个载入它的进程来说都是相同的;而在Win32环境中,情况却发生了变化,DLL函数中的代码所创建的任何对象(包括变量)都归调用它的线程或进程所有。当进程在载入DLL时,操作系统自动把DLL地址映射到该进程的私有空间,也就是进程的虚拟地址空间,而且也复制该DLL的全局数据的一份拷贝到该进程空间。也就是说每个进程所拥有的相同的DLL的全局数据,它们的名称相同,但其值却并不一定是相同的,而且是互不干涉的。

因此,在Win32环境下要想在多个进程中共享数据,就必须进行必要的设置。在访问同一个Dll的各进程之间共享存储器是通过存储器映射文件技术实现的。也可以把这些需要共享的数据分离出来,放置在一个独立的数据段里,并把该段的属性设置为共享。必须给这些变量赋初值,否则编译器会把没有赋初始值的变量放在一个叫未被初始化的数据段中。

 

#pragma data_seg预处理指令用于设置共享数据段。例如:

#pragma data_seg("SharedDataName")   HHOOK hHook=NULL;   //必须在定义的同时进行初始化!!!!#pragma data_seg()

在#pragma data_seg("SharedDataName")和#pragma data_seg()之间的所有变量将被访问该Dll的所有进程看到和共享。再加上一条指令#pragma comment(linker,"/section:.SharedDataName,rws"),[注意:数据节的名称is case sensitive]那么这个数据节中的数据可以在所有DLL的实例之间共享。所有对这些数据的操作都针对同一个实例的,而不是在每个进程的地址空间中都有一份。

 

当进程隐式或显式调用一个动态库里的函数时,系统都要把这个动态库映射到这个进程的虚拟地址空间里(以下简称"地址空间")。这使得DLL成为进程的一部分,以这个进程的身份执行,使用这个进程的堆栈。(这项技术又叫code Injection技术,被广泛地应用在了病毒、黑客领域!呵呵^_^)

 

第二点:在具体使用共享数据段时需要注意的一些问题!

      Win32 DLLs are mapped into the address space of the calling process. By default, each process using a DLL has its own instance of all the DLLs global and static variables. (注意: 即使是全局变量和静态变量也都不是共享的!)  If your DLL needs to share data with other instances of it loaded by other applications, you can use either of the following approaches:

·         Create named data sections using the data_seg pragma.

·         Use memory mapped files. See the Win32 documentation about memory mapped files.

Here is an example of using the data_seg pragma:

#pragma data_seg (".myseg")
   int i = 0;
   char a[32] = "hello world";
#pragma data_seg()

data_seg can be used to create a new named section (.myseg in this example). The most typical usage is to call the data segment .shared for clarity. You then must specify the correct sharing attributes for this new named data section in your .def file or with the linker option /SECTION:.MYSEC,RWS.  (这个编译参数既可以使用pragma指令来指定,也可以在VC的IDE中指定!)

There are restrictions to consider before using a shared data segment:

·         Any variables in a shared data segment must be statically initialized. In the above example, i is initialized to 0 and a is 32 characters initialized to hello world.

·         All shared variables are placed in the compiled DLL in the specified data segment. Very large arrays can result in very large DLLs. This is true of all initialized global variables.

·         Never store process-specific information in a shared data segment. Most Win32 data structures or values (such as HANDLEs) are really valid only within the context of a single process.

·         Each process gets its own address space. It is very important that pointers are never stored in a variable contained in a shared data segment. A pointer might be perfectly valid in one application but not in another.

·         It is possible that the DLL itself could get loaded at a different address in the virtual address spaces of each process. It is not safe to have pointers to functions in the DLL or to other shared variables.

 

 
从USB 2.0到USB 3.x:Synopsys SVT USB VIP配置避坑与接口选择指南 本文详细解析了从USB 2.0到USB 3.x的Synopsys SVT USB VIP配置要点,涵盖协议版本选择、物理接口匹配及UVM层次化架构实现。重点介绍了layering sequence的配置技巧和常见问题解决方案,帮助验证工程师高效避坑并优化验证流程。 阅读详情

相关推荐

嵌入式开发必备:aarch64-linux-gnu-gcc交叉编译工具链保姆级安装指南(含常见错误解决)

本文详细介绍了aarch64-linux-gnu-gcc交叉编译工具链的安装与配置方法,涵盖从系统软件源安装到Linaro二进制包部署的全流程。针对嵌入式开发中常见的依赖错误、版本冲突等问题提供实用解决方案,并分享性能优化技巧与项目集成经验,帮助开发者高效完成ARM64设备的跨平台开发。

yoga7的博客 1030

dll共享段中一些需要注意的问题

VisualC++ 如何与应用程序或其他DLL共享自己DLL中的数据? Win32DLL映射到调用进程的地址空间中。默认情况下,每个使用DLL的进程都有自己的所有DLL全局变量和静态变量的实例。如果DLL需要与它的由其他应用程序加载的其他实例共享数据,则可使用下列方法之一: 使用data_seg杂注创建命名数据节。 使用内存映射文件。请参见有关内存映射文件的...

weixin_34184158的博客 338

点餐系统数据库设计--SQL Server

友情链接 1、学生成绩管理系统数据库设计–MySQL 学生成绩管理系统数据库设计–MySQL 2、医疗信息管理系统数据库–MySQL 医疗信息管理系统数据库–MySQL 3、邮件管理数据库设计–MySQL 邮件管理数据库设计–MySQL 4、SQL Server医疗信息管理系统数据库【英文版-源码】–(Medical Management System Database) SQL Server医疗信息管理系统数据库【英文版-源码】–(Medical Management System Database) 5

若如初见 8万+

DLL动态链接库共享数据段的问题

#pragma comment(linker, "/section:.shareseg,rws") 加入这行预编译指令可以使指定的段.shareseg加上read,write, share属性,即读写共享,在这个数据段中的数据,在所有加载该dll的进程内共享。 今天在使用的时候发现一个问题,如果在"/section:.shareseg,rws"这段.shareseg,后面加上一个空格的话,即这

nbabn的专栏 1049

ROS2节点通信实战:用C++手写一个‘智能小车’控制模型(附完整代码)

本文详细介绍了如何使用ROS2和C++构建一个智能小车控制模型,涵盖运动控制节点、电池管理服务、参数动态配置和Rviz可视化等核心功能。通过实战项目演示ROS2节点通信机制,帮助开发者快速掌握机器人开发的关键技术,并提供了完整的代码实现和系统集成方案。

weixin_30607029的博客 262

Ansys CFX Pre 中 RGP 表的高级配置与优化策略

本文深入探讨了Ansys CFX Pre中RGP表的高级配置与优化策略,旨在帮助用户将仿真从“能用”提升至“精准好用”。文章重点解析了如何根据具体仿真场景,科学设定温度压力范围、选择流体类型,并针对相变等复杂工况实施网格加密与分离建表等关键优化技术,以显著提升计算精度与稳定性。

weixin_29216957的博客 1180

如何在Windows下实现动态链接库(DLL)共享数据段

《 程序员的自我修养》一书9.1.3节中描述了DLL共享数据段的功能和原理,本人通过上网搜索并编写测试程序,找到了实现方法,现简述如下:     1. 在DLL实现文件(.c, .cpp)中定义自定义数据段,并指定其读写和共享权限,具体如下: #pragma data_seg (".myseg") SHAREDATADLL_API int g_nCount = 0;  SHAREDATAD

daofengdeba 2752

【5G全网建设】Option3X和Option2模式建安市、兴城市和四水市核心网、承载网网络设计与部署

拓扑规划: Option 3X网络拓扑图规划 Option 2网络拓扑图规划 设备部署: 建安市核心网 建安市承载中心机房 建安市骨干汇聚机房 建安市3区汇聚机房 建安市C站点无线机房 兴城市核心网 兴城市承载中心机房 兴城市骨干汇聚机房 兴城市2区汇聚机房 兴城市B站点无线机房 数据配置: 建安市核心网 建安市承载中心机房 建安市骨干汇聚机房 建安市3区汇聚机房 建安市C站点无线机房 兴城市核心网 兴城市承载中心机房 兴城市骨干汇聚机房 兴城市2区汇聚机房 兴城市B站点无线机房 业务调试

weixin_67183034的博客 8858

DLL 共享数据段

Win32 DLL 映射到调用进程的地址空间中。默认情况下,每个使用 DLL 的进程都有自己的所有 DLL 全局变量和静态变量的实例。DLL 需要与它的由其他应用程序加载的其他实例共享数据,则可使用下列方法之一: 使用 data_seg 杂注创建命名数据节。 使用内存映射文件。请参见 MSDN Lib中的文档“Managing Memory-Mapped Files in Win32”(管理 Win32 中的内存映射文件)。 在这里我们讨论第一种使用data_seg。 示例 #pragma data_s

xuancuo8078的博客 482

独创改进 | RT-DETR 引入 Asymptotic Hybrid Encoder | 渐进混合特征解码结构

独创改进🚀! | RT-DETR 引入 Asymptotic Hybrid Encoder | 渐进混合特征解码结构

Coding... 2212

MIL图像处理那些事:MIL的安装和MIL工具箱

MIL图像处理那些事:MIL的安装和测试,如何用C#使用MIL

十多年IT经验,专注机器视觉,智能制造半导体行业 5274

DLL共享数据段,实现多进程数据共享总结

    前段时间一直用WM_COPYDATA消息实现进程数据通信,这次软件升级想学习一下,DLL共享数据段应用,因为这个比共享内存简单一些,向VCKBASE前辈请教了很多,最后明白了下面的点滴问题简述假想通过DLL实现进程数据共享?实现第一步:在DLL的.CPP文件中定义共享数据段#pragma data_seg("SHARED_OPCDATASET")/* volatil

PerfectToday的专栏 7192

《Zephyr OS 入门与实战》第15章:LoRaWAN 集成

【代码】《Zephyr OS 入门与实战》第15章:LoRaWAN 集成。

2301_79143213的博客 610

DLL中建立进程共享数据段需要注意的语法问题

默认情况下,所有的数据段都是进程独立的,每个进程有自己的一份。但有时候进程共享一个数据段也是有需要的,为此VC++编译连接器提供了专门的语法,下面是一个典型的例子,建立了一个名为Shared的共享数据段,该数据段里只有一个变量g_hwndOwner。////////////////////////////////////////////// 进程共享区 //////////////////////

smstong的成长轨迹 3934

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

设置dll的共享数据段

BCB直接在DLL中定义共享内存单元的步骤如下:    假设DLL的工程名为MouseHook.bpr(编译后产生MouseHook.DLL)       1.在一程序模块 Unit1.cpp的最前面加上:            #pragma option -zRSHSEG      // 改变缺省数据段名            #pragma option -zTSHCLASS    

u010218033的专栏 1193

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

DLL之共享数据段(转)

       在主文件中,用#pragma data_seg建立一 个新的数据段并定义共享数据,其具体格式为:  #pragma data_seg ("shareddata") //名称可以                      

jiahehao的专栏 1361

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

DLL里面的共享数据段怎么写?

DLL里面的共享数据段怎么写? Delphi / Windows SDK/APIhttp://www.delphi2007.net/DelphiAPI/html/delphi_20061208112551103.html DLL里面的共享数据段怎么写?   用delphi,谢谢! 怎么没人回啊!? 内存映射文件,Delphi好似没有共享段的声明。 楼上,不是吧,我现在的情况是在调用d...

weixin_33816821的博客 144

VS2010_DLL_共享数据段

1、问题:写了一个DLL,自己一直测试不成功(程序A设置了 数值之后,程序B 始终读不到 读出来的都是初始化时的数值...)   具体过程:     (1)、DLL当初没想要用 共享数据段,测试使用 一直都是OK的     (2)、ExeA 和 ExeB 都会使用这个DLL     (3)、想要简单的 进程通信功能,于是添加了共享数据段。     (4)、我测试时是这样:ExeA(存...

weixin_30443895的博客 322

Dll的各进程之间共享-#pragma data_seg预处理指令用于设置共享数据段

Dll的各进程之间共享-#pragma data_seg预处理指令用于设置共享数据段 在Win16环境中,DLL的全局数据对每个载入它的进程来说都是相同的;而在Win32环境中,情况却发生了变化,DLL函数中的代码所创建的任何对象(包括变量)都归调用它的线程或进程所有。当进程在载入DLL时操作系统自动把DLL地址映射到该进程的私有空间,也就是进程的虚拟地址空间,而且也复制该DLL的全局数据的一份拷贝到该进程空间。也就是说每个进程所拥有的相同的DLL的全局数据,它们的名称相同,但其值却并不一定是相同的,而且是

scollins的专栏 829
上一篇: Win32下的录音编程
下一篇: API HOOK 金山词霸取词功能原理1
ALENTAM
博客等级 码龄21年 17粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值