Windows在一个Win32程序的地址空间周围筑了一道墙。通常,一个程序的地址空间中的数据是私有的,对别的程序而言是不可见的。但是执行多个执行实体表示了程序的所有执行实体之间共享数据是毫无问题的。当您在一个窗口中增加或者删除一个字符串时,这种改变将立即反映在其它的窗口中。
    在全部例程之间,STRLIB共享两个变量:一个字符数组和一个整数(记录已储存的有效字符串的个数)。这两个变量储存在共享的一个特殊内存区段中:

#pragma data_seg ("shared")
        int iTotal = 0;
        WCHAR szStrings [MAX_STRINGS][MAX_LENGTH + 1] = {'\0'};
    #pragma data_seg ()

第一个#pragma叙述建立数据段,这里命名为shared。您可以将这段命名为任何一个您喜欢的名字。在这里的#pragma叙述之后的所有初始化了的变量都放在shared数据段中。
    第二个#pragma叙述标示段的结束。对变量进行专门的初始化是很重要的,否则编译器将把它们放在普通的未初始化数据段中而不是放在shared中。

连结器必须知道有一个「shared」共享数据段。可以直接用DLL原始码指定连结选项,就像这样:
        #pragma comment(linker,"/SECTION:shared,RWS")        字母RWS表示段具有读、写和共享属性。

共享的内存段允许iTotal变量和szStrings字符串数组在该程序所有例程之间共享。因为MAX_STRINGS等于256,而MAX_LENGTH等于63,所以,共享内存段的长度为32,772字节-iTotal变量需要4字节,256个指针中的每一个都需要128字节。

1.#pragma data_seg()一般用于DLL中。也就是说,在DLL中定义一个共享的,有名字的数据段。最关键的是:这个数据段中的全局变量可以被多个进程共享。否则多个进程之间无法共享DLL中的全局变量。
    2.共享数据必须初始化,否则微软编译器会把没有初始化的数据放到.BSS段中,从而导致多个进程之间的共享行为失败。

下面看一个实际应用,用共享数据来统计应用程序启动的次数,并作相应的处理。

在应用程序的入口处:
//控制应用程序只能启动一次
#pragma data_seg("flag_data")
int count=0;
#pragma data_seg()
#pragma comment(linker,"/SECTION:flag_data,RWS")

if(count>1)
{

MessageBox("已经启动了一个应用程序","Warning",MB_OK);
return FLASE;
}
count++;
转自:http://happyboy200032.blog.163.com/blog/static/469031132010713129590/

转载于:https://www.cnblogs.com/2f28/p/10006025.html

#pragma comment(linker,/SECTION:shared,RWS)相关推荐

  1. 屏蔽控制台应用程序的窗口#pragma comment(linker, /subsystem:windows /ENTRY:mainCRTStartup)...

    众所周知,控制台应用程序一般都会显示一个控制台窗口(虚拟DOS窗口),但很多时候控制台程序的执行逻辑根本不需要与用户进行交互,所以显示这个难看的窗口纯属多余,那么如何将它屏蔽掉呢?下面我向大家介绍一种 ...

  2. 屏蔽控制台应用程序的窗口#pragma comment(linker, /subsystem:windows /ENTRY:mainCRTStartup)

    屏蔽控制台应用程序的窗口#pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup") 众所周知,控制台应用 ...

  3. [转]#pragma once和#pragma comment

    编程经常碰到,理解的总不是很透彻,在这里查阅资料总结一下! 在编写程序的时候,我们常用到#pragma指令来设定编译器的状态或者是指示编译器完成一些特定的动作. #pragma once : 这是一个 ...

  4. #pragma comment和#pragma 预处理指令详解

    该宏放置一个注释到对象文件或者可执行文件. 例如,#pragma   comment(lib,"Ws2_32.lib")表示链接Ws2_32.lib这个库. 和在工程设置里写上链入 ...

  5. 预处理指令pragma常见用法集锦(#pragma once、#pragma comment和#pragma warning)

    #pragma once: 这是一个比较常用的指令,只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,避免文件被重复包含. ********************************* ...

  6. pragma comment的使用(转)

    #pragma 的使用 尽管 C 和 C++ 都已经有标准,但是几乎每个编译器 (广义,包含连接器等) 扩展一些 C/C++ 关键字. 合理地应用这些关键字,有时候能使我们的工作非常方便.下面随便说说 ...

  7. #pragma comment 的使用方法

    [cpp] view plaincopy #pragma comment ( lib,"wpcap.lib" ) 表示链接wpcap.lib这个库. 和在工程设置里写上链入wpca ...

  8. VS2008下利用#pragma comment屏蔽VC/VS生成的exe程序的CMD窗口

    2016-6-1日注:此种方法并不适用于VS2012,在VS2012中屏蔽CMD的方法可以见博文:VS2012及VS系列怎样屏蔽CMD窗口~_昊虹图像算法-CSDN博客_vs 不打开cmd 有时候我们 ...

  9. [转]pragma comment的使用

    pragma comment的使用 该宏放置一个注释到对象文件或者可执行文件. #pragma comment( comment-type [,"commentstring"] ) ...

最新文章

  1. opencv-mediapipe手部关键点识别
  2. WPF Geometry 添加Path数据
  3. Google App Engine技术架构之Google App Engine的简介
  4. 主成分分析原理解释(能力工场小马哥)
  5. velocity自定义函数_velocity基本语法和总结
  6. QQ连连看棋盘数组找法:
  7. Let's Encrypt 申请通配符证书(使用DnsPod解析的域名操作)
  8. 想学人工智能从哪入手?
  9. JVM,JRE,JDK之间的区别和联系
  10. 奥特曼传奇英雄存档丢了怎么找回_热血传奇:法师前期跨级刷怪到底划不划算?...
  11. 自定义view局部刷新_View
  12. 小白学习一eNSP华为模拟器(3) 交换机基础配置 实验四VLAN 配置Trunk
  13. C语言中do while用法
  14. 读书笔记——魔鬼经济学3
  15. c语言sql数据库大作业,c语言连接sql数据库.docx
  16. 简单控件学习——Lable/HyperLink
  17. 通过cv2.resize()来改变图片大小
  18. 命主属性是水什么意思_八字五行属性查询表,有没有五行属性含水的且
  19. 考拉海购与京东结合起来居然原来如此漂亮
  20. oracle system和sysaux表空间清理和回收

热门文章

  1. SpringMVC和SpringBoot的拦截器 HandlerInterceptor 入门
  2. 【Linux独家秘方】Linux 定时备份oracle库的数据
  3. 为什么Map桶中个数超过8才转为红黑树
  4. 1031 Hello World for U
  5. Bit-Z转入GXS、PPS、SPHTX、EOS未到账解决方案
  6. Android污点分析工具flowdroid源码简析
  7. Android系统启动流程分析之安装应用
  8. Linux kernel 3.10内核源码分析--进程退出exit_code
  9. Android安全教程(3)---Fiddler简易使用教程之抓取https包
  10. android excel 筛选功能,Android实现Excel表格展示数据