-在可执行文件或DLL的多个实例之间共享静态数据
2011-08-26 13:49
218 查看
全局数据和静态数据不能被同一个. exe或DLL文件的多个映像共享,这是个安全的默认设置。但是,在某些情况下,让一个. exe文件的多个映像共享一个变量的实例是非常有用和方便的.
每个. exe或DLL文件的映像都由许多节组成。按照规定,每个标准节的名字均以圆点开头。
每一节都拥有与其相关的一组属性
exe或DLL文件各节的属性
常见的节名及作用
怎么查看这些节
可以用使用: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;
[/code]
多次运行本例子:可以看到g_nCount1和g_nCount3在递增,而g_nCount2保持不变。
每个. 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;
[code]#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; }
[/code]
多次运行本例子:可以看到g_nCount1和g_nCount3在递增,而g_nCount2保持不变。
相关文章推荐
- 在可执行文件或DLL的多个实例之间共享静态数据
- windows笔记-在可执行文件或DLL的多个实例之间共享静态数据
- 在可执行文件或DLL的多个实例之间共享静态数据
- 《windows核心编程》学习笔记——在同一个可执行文件或dll的多个实例间共享静态数据
- DLL在多个相同或不同的exe之间共享静态数据
- <php+mysql>上传文件到指定文件夹,共享数据和脚本,文件验证,脚本之间的通信
- 使用内存映射文件在进程之间共享数据
- 使用内存映射文件在进程之间共享数据
- windows笔记-使用内存映射文件在进程之间共享数据
- C++ 一个exe的两个运行实例之间共享数据
- [Android实例] Activity之间数据传递与共享的几种途径(bitmap篇)
- 使用原生redux模块在React组件之间实现数据共享小实例
- windows下文件共享以及通过网线在两台Windows电脑之间传数据
- 如何使用数据卷在宿主机和docker容器之间共享文件
- C++ 一个exe的两个运行实例之间共享数据
- windows笔记-使用内存映射文件在进程之间共享数据
- 同一程序不同实例进程之间共享数据
- GFS安装实例-解决共享存储文件系统数据不同步问题
- 通过virtualbox的数据空间在linux虚拟机与windows主机之间共享文件
- 使用内存映射文件在进程之间共享数据