#pragma comment(linker,"/SECTION:shared,RWS")

作者:佚名 上传时间:2019-06-01 版权申诉
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++;

免责申明:文章和图片全部来源于公开网络,如有侵权,请通知删除 server@dude6.com

用户评论
相关推荐
#pragma comment(linker,"/SECTION:shared,RWS")
Windows在一个Win32程序的地址空间周围筑了一道墙。通常,一个程序的地址空间中的数据是私有的,对别的程序而言是不可见的。但是执行多个执行实体表示了程序的所有执行实体之间共享数据是毫无
深入探讨quot amp lt br amp gt quotquot r n quot
\r\n是输出的HTML代码换行,客户看到的效果没有换行。在页面里这两个是看不到效果的.右键查看源文件可以看到代码换行
pdf
39.84 KB
2021-10-19 15:58
利用JScript中运算符quot quotquot amp amp quot的特殊特性实
利用JScript中运算符"||"和"&&"的特殊特性实现代码精简第1/2页
pdf
67.08 KB
2022-03-01 14:53
部署web项目时tomcat出现 Exception in thread "main"错误
最主要原因:容器使用的JDK版本不匹配 比如tomcat7 就不支持JDK5,这是根本性的问题, 解决方法:根据对应的tomcat使用相匹配的JD
微信quot errcode quot48001quot errmsg quot quot api un
微信{"errcode":48001,"errmsg":"api unauthorized, hints: [ req_id: 1QoCla0699n
pdf
68.22 KB
2021-06-06 18:56
javaScript中quot quotquot quot的区别详解
先说 "===",这个比较简单。例外)的是,如果其中至少一个是NaN,那么[不相等]。b、如果一个是字符串,一个是数值,把字符串转换成数值再进行比较。对象转换成基础类型,利用它的t
pdf
46.63 KB
2021-12-02 16:04
c++中#include amp lt amp gt与#include quot quot的区别详细解析
所以像标准的头文件 stdio.h、stdlib.h等用这个方法。而""首先在当前目录下寻找,如果找不到,再到系统目录中寻找。这个用于include自定义的头文件,让系统优先使用当
pdf
30.14 KB
2021-08-10 09:24
Python中运算符quot quotquot is quot的详解
Python中运算符"=="和"is"的详解
pdf
67.96 KB
2022-03-19 12:33
file_get_contents quot php input quot quot r quot实例介绍
解释不清,直接上例子index.htmlaction.php
pdf
41.31 KB
2021-10-20 23:15
JS中type quot button quot和type quot submit quot的区别
JS中type="button"和type="submit"的区别
pdf
48.35 KB
2021-11-27 12:12