您的位置:首页 > 其它

-在可执行文件或DLL的多个实例之间共享静态数据

2011-08-26 13:49 218 查看
全局数据和静态数据不能被同一个. 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;



[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保持不变。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: