zoukankan      html  css  js  c++  java
  • windows笔记在可执行文件或DLL的多个实例之间共享静态数据

    fangyukuan

    2010.7.11

    全局数据和静态数据不能被同一个. exeDLL文件的多个映像共享,这是个安全的默认设置。但是,在某些情况下,让一个. exe文件的多个映像共享一个变量的实例是非常有用和方便的.

    每个. exeDLL文件的映像都由许多节组成。按照规定,每个标准节的名字均以圆点开头。

           每一节都拥有与其相关的一组属性

    exeDLL文件各节的属性

    属性

    含义

    READ

    该节中的字节可以读取

    WRITE

    该节中的字节可以写入

    EXECUTE

    该节中的字节可以执行

    SHARED

    该节中的字节可以被多个实例共享(本属性能够有效地关闭copy-on-write机制)

     

    常见的节名及作用

    节名

    作用

    .bss

    未经初始化的数据

    .CRT

    C运行期只读数据

    .data

    已经初始化的数据

    .debug

    调试信息

    .didata

    延迟输入文件名表

    .edata

    输出文件名表

    .idata

    输入文件名表

    .rdata

    运行期只读数据

    .reloc

    重定位表信息

    .rsrc

    资源

    .text

    . e x eD 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
  • 相关阅读:
    转载:ORA-01438: 值大于为此列指定的允许精度
    PLSQL碰到pls-00103的错误解决办法
    spring 的xml配置使用p标签简化
    spring aop实现拦截接口请求打印日志
    response 设置头的类型 (转)
    js或者ext js获取返回值
    ext grid 前台grid加载数据碰到数据重复只显示一条
    关于struts和Spring 结合到一起之后存在ACtion创建单实例还是多
    SVN提交碰到的问题奇怪的问题
    关于项目使用可配置的properties 文件的实现
  • 原文地址:https://www.cnblogs.com/fangyukuan/p/1775277.html
Copyright © 2011-2022 走看看