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
windows笔记-在可执行文件或DLL的多个实例之间共享静态数据的更多相关文章
- [笔记]Delphi 2007写DLL供VC调用实例
考虑如下几种常用情况: - VC传入int,返回int- VC传入char *,返回int- VC传入char *,返回char *及int 为简化问题,传递的字符串参数只考虑ANSI格式,不考虑UN ...
- [原创]使用GCC创建 Windows NT 下的内核DLL
原文链接:使用GCC创建 Windows NT 下的内核DLL 在温习<<Windows 2000 Driving>>分层驱动程序一章的时候,看到了关于紧耦合驱动连接方式,这种 ...
- Windows笔记目录
Windows笔记目录 Windows介绍 Windows入门--个人感想 初入Linux AD域控 FTP 服务器及权限 Server-U FTP与AD完美集成方案详解 其他 Linux大文件传 ...
- Windows自删除程序和DLL
Windows自删除程序和DLL 参照文章 http://blog.csdn.net/rxxi/article/details/741557 做了个自删除的程序SelfDelete.代码下载(我的FT ...
- .h(头文件) .lib(库文件) .dll(动态链接库文件) 之间的关系和作用的区分
.h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的.附加依赖项的是.lib不是.dll,若生成了DLL,则肯定也生成 LIB文件.如果要完成源代码的编译和链接,有头文件和lib就够了 ...
- windows使用nginx+memcached实现负载均衡和session或者缓存共享
windows使用nginx+memcached实现负载均衡和session或者缓存共享 两台server server1:115.29.186.215 windows2008 64位操作系统 ser ...
- 如何在Windows系统上用抓包软件Wireshark截获iPhone等网络通讯数据
http://www.jb51.net/os/windows/189090.html 今天给大家介绍一种如何在Windows操作系统上使用著名的抓包工具软件Wireshark来截获iPhone.iPa ...
- 纯静态界面中(html)中通过js调用dll中的方法从数据库中读取数据
最近接到一个离职员工的任务,一个搭好框架的ERP系统,看了两天,说一下看到的东西,整个项目目录中我没发现一个.aspx后缀的文件,全是静态HTML文件,之后发现他用的jquery简直看的头疼,不过大概 ...
- 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 ...
随机推荐
- K8s基本概念资料
https://www.cnblogs.com/menkeyi/p/7134460.html
- 测试笔记01-Git
Git工具 Git 一个分布式版本管理工具, 学习资料: https://www.liaoxuefeng.com/wiki/896043488029600/1317161920364578 其中:解决 ...
- C++:第一个c++程序
// C++ 环境搭建: https://www.bilibili.com/video/BV1nt4y1r7Ez?t=535 // 学习资料:https://www.runoob.com/cplusp ...
- python读取csv,Excel,Txt,Yaml 文件
1.数据 1.Csv login.csv文件: byhy,88888888 ReadCsv.py文件 import csv #导入csv包 class ReadCsv(): def csv(self) ...
- Docker隔离技术
前言 Docker系列文章: 此篇是Docker系列的第九篇,之前的文章里面或多或少的提到Docker的隔离技术,但是没有很清楚的去聊这个技术,但是经过这么多文章大家一定对Docker使用和概念有了一 ...
- 2021年BI软件排名,国内外BI软件功能对比
数据分析是帮助企业深入了解自身业务表现(例如正在做什么或哪块业务需要注意和改进)的重要元素.为了获得更直观的展现,数据分析BI软件可帮助公司通过报告.数据可视化.应用程序等从数据中获取决策数据支撑.没 ...
- VUE SpringCloud 跨域资源共享 CORS 详解
VUE SpringCloud 跨域资源共享 CORS 详解 作者: 张艳涛 日期: 2020年7月28日 本篇文章主要参考:阮一峰的网络日志 » 首页 » 档案 --跨域资源共享 CORS 详解 ...
- jquery点击空白处事件
$(document).live('click',function(){ $('.emails').hide(); }); 此代码为点击空白处,'emails',标签隐藏.
- PHP-CGI远程代码执行漏洞(CVE-2012-1823)
影响版本 php < 5.3.12 or php < 5.4.2 访问http://p:8080/index.php?-s即爆出源码,说明漏洞存在 POST /index.php?-d+a ...
- centos 7 网络静态IP配置文件
TYPE=EthernetPROXY_METHOD=noneBROWSER_ONLY=noBOOTPROTO=staticIPADDR=10.86.128.160GETWAY=10.86.128.1P ...