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

简介:     Windows在一个Win32程序的地址空间周围筑了一道墙。通常,一个程序的地址空间中的数据是私有的,对别的程序而言是不可见的。
    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++;
目录
相关文章
Encountered </#list>, but was expecting one of
版权声明:本文为 testcs_dn(微wx笑) 原创文章,非商用自由转载-保持署名-注明出处,谢谢。 https://blog.csdn.net/testcs_dn/article/details/81001864 freemarker.
3405 0
|
编译器 C++
#pragma comment是什么
#pragma comment是什么
190 0
GLib-CRITICAL : g_variant_get_uint32: assertion ‘g_variant_is_of_type (value, G_VARIANT_TYPE_UINT32)
GLib-CRITICAL : g_variant_get_uint32: assertion ‘g_variant_is_of_type (value, G_VARIANT_TYPE_UINT32)
174 0
|
编译器
warning C4995: strcat name was marked as #pragma deprecated
warning C4995: strcat name was marked as #pragma deprecated
102 0
|
JSON fastjson 数据格式
报错:JSONException: illegal identifier : {pos 1, line 1, column 2{{"group":"trade_p0&qu
报错:JSONException: illegal identifier : {pos 1, line 1, column 2{{"group":"trade_p0&qu
606 0
|
PHP
【PHP报错集锦】Integrity constraint violation: 1052 Column 'vt_id' in where clause is ambiguous
【PHP报错集锦】Integrity constraint violation: 1052 Column 'vt_id' in where clause is ambiguous
341 0
【PHP报错集锦】Integrity constraint violation: 1052 Column 'vt_id' in where clause is ambiguous
|
编译器 C++
Effective C++条款 02:尽量以 const, enum, inline 替换 #define
Effective C++条款 02:尽量以 const, enum, inline 替换 #define
140 0
|
移动开发 前端开发 JavaScript
AMP for E-Commerce Part 1: Basic Building Blocks and UI Using AMP
In this three-part tutorial, we will explore how to create a fully functional e-commerce mobile application using AMP.
1629 0
AMP for E-Commerce Part 1: Basic Building Blocks and UI Using AMP
|
C++
一起谈.NET技术,编写T4模板无法避免的两个话题:"Assembly Locking"&"Debug"
  在这之前,我写了一系列关于代码生成和T4相关的文章,而我现在也试图将T4引入我们自己的开发框架。在实践中遇到了一些问题,也解决了不少问题。如果你也在进行T4相关的开发,相信你也一定会遇到这些问题。为此,特意将这些问题和解决方案与朋友们分享,希望在遇到这些问题的时候少走弯路。
1080 0