windows笔记-在可执行文件或DLL的多个实例之间共享静态数据
全局数据和静态数据不能被同一个. exe或DLL文件的多个映像共享,这是个安全的默认设置。但是,在某些情况下,让一个. exe文件的多个映像共享一个变量的实例是非常有用和方便的.
每个. exe或DLL文件的映像都由许多节组成。按照规定,每个标准节的名字均以圆点开头。
每一节都拥有与其相关的一组属性
exe或DLL文件各节的属性
属性 |
含义 |
READ |
该节中的字节可以读取 |
WRITE |
该节中的字节可以写入 |
EXECUTE |
该节中的字节可以执行 |
SHARED |
该节中的字节可以被多个实例共享(本属性能够有效地关闭copy-on-write机制) |
常见的节名及作用
节名 |
作用 |
.bss |
未经初始化的数据 |
.CRT |
C运行期只读数据 |
.data |
已经初始化的数据 |
.debug |
调试信息 |
.didata |
延迟输入文件名表 |
.edata |
输出文件名表 |
.idata |
输入文件名表 |
.rdata |
运行期只读数据 |
.reloc |
重定位表信息 |
.rsrc |
资源 |
.text |
. e x e或D L L文件的代码 |
.tls |
线程的本地存储器 |
.xdata |
异常处理表 |
怎么查看这些节
可以用使用:Microsoft的Visual Studio的DumpBin实用程序
有一个更方便的工具:eXeScope.exe
怎么创建自己的节并让多个实例共享数据
- 自定义一个节
- 把变量放到自定义节中
- 注意变量要初始化。
- 告诉链接程序,某个节中的变量是需要加以共享的
如下:
#pragma comment(linker, "/SECTION:Shared,RWS")
#pragma data_seg("Shared")
long g_nCount1 = 0;
#pragma data_seg()
也可以用allocate把某变量加入到自定义节中,如下
__declspec(allocate("Shared")) long g_nCount3 = 0;
#include "stdafx.h"
#include "stdlib.h"
#include <iostream>
using namespace std;
#pragma comment(linker, "/SECTION:Shared,RWS") // 告诉链接程序,某个节中的变量是需要加以共享的
#pragma data_seg("Shared") // 创建一个称为“Shared”的节
long g_nCount1 = 0;
long g_nCount2;
#pragma data_seg()
// 也可以用allocate把某变量加入到自定义节中
__declspec(allocate("Shared")) long g_nCount3 = 0;
int _tmain(int argc, _TCHAR* argv[])
{
cout << "g_nCount1: " << ++g_nCount1 << " // 有初始化, 有加到自定义节中" << endl;
cout << "g_nCount2: " << ++g_nCount2 << " // 没有初始化,没有加到自定义节中" << endl;
cout << "g_nCount3: " << ++g_nCount3 << " // 利用__declspec(allocate(\"Shared\")) 把变量加到自定义节中" << endl;
system("pause");
return 0;
}
多次运行本例子:可以看到g_nCount1和g_nCount3在递增,而g_nCount2保持不变。
本文地址:http://www.cnblogs.com/fangyukuan/archive/2010/07/11/1775277.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET10 - 预览版1新功能体验(一)