全局数据和静态数据不能被同一个. 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

怎么创建自己的节并让多个实例共享数据

  1. 自定义一个节
  2. 把变量放到自定义节中
  3. 注意变量要初始化。
  4. 告诉链接程序,某个节中的变量是需要加以共享的

如下:

#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

windows笔记-在可执行文件或DLL的多个实例之间共享静态数据的更多相关文章

  1. [笔记]Delphi 2007写DLL供VC调用实例

    考虑如下几种常用情况: - VC传入int,返回int- VC传入char *,返回int- VC传入char *,返回char *及int 为简化问题,传递的字符串参数只考虑ANSI格式,不考虑UN ...

  2. [原创]使用GCC创建 Windows NT 下的内核DLL

    原文链接:使用GCC创建 Windows NT 下的内核DLL 在温习<<Windows 2000 Driving>>分层驱动程序一章的时候,看到了关于紧耦合驱动连接方式,这种 ...

  3. Windows笔记目录

    Windows笔记目录   Windows介绍 Windows入门--个人感想 初入Linux AD域控 FTP 服务器及权限 Server-U FTP与AD完美集成方案详解 其他 Linux大文件传 ...

  4. Windows自删除程序和DLL

    Windows自删除程序和DLL 参照文章 http://blog.csdn.net/rxxi/article/details/741557 做了个自删除的程序SelfDelete.代码下载(我的FT ...

  5. .h(头文件) .lib(库文件) .dll(动态链接库文件) 之间的关系和作用的区分

    .h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的.附加依赖项的是.lib不是.dll,若生成了DLL,则肯定也生成 LIB文件.如果要完成源代码的编译和链接,有头文件和lib就够了 ...

  6. windows使用nginx+memcached实现负载均衡和session或者缓存共享

    windows使用nginx+memcached实现负载均衡和session或者缓存共享 两台server server1:115.29.186.215 windows2008 64位操作系统 ser ...

  7. 如何在Windows系统上用抓包软件Wireshark截获iPhone等网络通讯数据

    http://www.jb51.net/os/windows/189090.html 今天给大家介绍一种如何在Windows操作系统上使用著名的抓包工具软件Wireshark来截获iPhone.iPa ...

  8. 纯静态界面中(html)中通过js调用dll中的方法从数据库中读取数据

    最近接到一个离职员工的任务,一个搭好框架的ERP系统,看了两天,说一下看到的东西,整个项目目录中我没发现一个.aspx后缀的文件,全是静态HTML文件,之后发现他用的jquery简直看的头疼,不过大概 ...

  9. Windows Server 2008 安装 10.2.0.5 单实例

    需求:Windows Server 2008 安装 10.2.0.5 单实例 原以为非常简单的一次任务,实际却遇到了问题,故记录一下. 1.安装10.2.0.1 2.安装10.2.0.4 3.安装10 ...

随机推荐

  1. ArchLinux安装步骤(一)

    本文为安装archlinux的教程,需要有硬盘分区,挂载等基础linux命令的了解还有vim的基本操作,不知道也没关系,这里有大神的视频教程ArchLinux指南. 确实是不是uefi模式 ls /s ...

  2. C语言:if条件写法

    if 语句的判断条件中不是必须要包含关系运算符,它可以是赋值表达式,甚至也可以是一个变量,常量 例如: //情况① if(b){ //TODO: } //情况② if(b=5){ //情况① //TO ...

  3. Day2基本数据类型 字节 和类型转换

    Java基础语法 注释 1.单行注释:// 加内容 2.多行注释:/* 多行注释 */ 3.文档注释: /** * * */ 有趣的注释 标识符 关键字 基本数据类型 八大基本数据类型 //整数​in ...

  4. 关于hive核心

    一.DDL数据定义 1.创建数据库 1)创建一个数据库,数据库在 HDFS 上的默认存储路径是/user/hive/warehouse/*.db. hive (default)> create ...

  5. sqliab刷题笔记-联合注入

    Less-1 测试是字符型还是数字型 判断所在字段数 查看显示值 可以看出显示2,3位置.因此我们选择2的位置进行联合注入 查看表名 我们要对admin,users等字符敏感 查看admin表中的字段 ...

  6. jumpserver 用户,系统用户和管理用户 普通用户和特权用户 区别

    前言 现在很多公司都有在用Jumpserver跳板机 有很多人一直对jumpserver的各种用户还不是很了解 当你了解了这几个概念了之后,就能更好的灵活的运用到分配权限当中去. 下面我们一个一个的说 ...

  7. python 连接mysql数据库操作

    import pymysql.cursors # 连接数据库 connect = pymysql.Connect( host='localhost', port=3306, user='root', ...

  8. C++第三十四篇 -- 安装Windows Driver后,编译以前项目出现打不开lib文件

    VS2017默认是没有安装WDK的,但是我们写驱动文件的话需要用到WDK.不过安装了WDK后,发现以前一些正常的项目在Release模式下编译会报LINK1104,无法打开.lib的错误 针对这个错误 ...

  9. 深度强化学习中稀疏奖励问题Sparse Reward

    Sparse Reward 推荐资料 <深度强化学习中稀疏奖励问题研究综述>1 李宏毅深度强化学习Sparse Reward4 ​ 强化学习算法在被引入深度神经网络后,对大量样本的需求更加 ...

  10. ES6新特征

    1.块级作用域 {   }  就是块级作用域,还包括if.else.for.while...下都属于块级作用域. let 声明的变量不存在变量的提升,不允许let反复声明同一个变量:块级作用域下let ...