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 ...
随机推荐
- Python单元测试框架unittest之单用例管理(二)
概述 利用python进行测试时,测试用例的加载方式有2种: 一种是通过unittest.main()来启动所需测试的测试模块,上篇文章就是使用的这种方式: 一种是添加到testsuite集合中再加载 ...
- Spring MVC中的M V C
M→Model 模型 V→View 视图 C→Controller 控制器 也就是说一次交互由生到死(请求到相应) 需要经过 这三个层级 来完成 那么为什么这么设计 这么设计又有什么好处 我是这么认为 ...
- Emoji.voto,Linkerd 服务网格(service mesh)的示例应用程序
一个微服务应用程序,允许用户为他们最喜欢的表情符号(emoji)投票,并跟踪排行榜上收到的投票.愿最好的 emoji 获胜. 该应用程序由以下 3 个服务组成: emojivoto-web:Web 前 ...
- 【有奖互动】HMS Core. Sparkle游戏应用创新沙龙,诚邀您参与
活动简介 随着互联网基础设施的完善和"宅经济"效应凸显,游戏行业逆势上扬,迎来巨大消费市场.同时,用户需求愈加多样化,如何进一步创新和技术升级.提升核心竞争力已成为游戏开发与运营的 ...
- windows系统显示文字编码的CMD命令
chcp命令,显示.设置系统文字编码格式.
- centos7 几种修改系统时区的方法
1. # cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime # ln -sf /usr/share/zoneinfo/Asia/Shanghai ...
- 【C#】C#中使用GDAL3(二):Windows下读写Shape文件及超详细解决中文乱码问题
转载请注明原文地址:https://www.cnblogs.com/litou/p/15035790.html 本文为<C#中使用GDAL3>的第二篇,总目录地址:https://www. ...
- 为什么每次下载后必须关闭掉IO流(十五)
读一个文件,忘记关闭了流,你在操作系统里对这个文件的写,删除等操作就会报错,告诉你这个文件被某个进程占用,这是为什么呢? java是从c++设计来的,但是无论是C语言还是C++,都需要手动释放内存,j ...
- 消息队列 折腾ActiveMQ时遇到的问题和解决方法
1.先讲严重的:服务挂掉. 这得从ActiveMQ的储存机制说起.在通常的情况下,非持久化消息是存储在内存中的,持久化消息是存储在文件中的,它们的最大限制在配置文件的<systemUsage&g ...
- ELK:match 的底层转换
在ES中,执行match搜索的时候,ES底层通常都会对搜索条件进行底层转换,来实现最终的搜索结果.如: GET /student/java/_search { "query": { ...