加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

#pragma data_seg() 共享数据// MyData段 // 进程 // DLL

发布时间:2020-12-14 02:28:43 所属栏目:Windows 来源:网络整理
导读:https://www.cnblogs.com/dongsheng/p/4476157.html http://www.cnblogs.com/CBDoctor/archive/2013/01/26/2878201.html https://www.cnblogs.com/wwb0111/archive/2012/05/26/3098963.html #pragma data_seg()一般用于DLL中 在DLL中定义一个共享的,有名字

https://www.cnblogs.com/dongsheng/p/4476157.html

http://www.cnblogs.com/CBDoctor/archive/2013/01/26/2878201.html

https://www.cnblogs.com/wwb0111/archive/2012/05/26/3098963.html

#pragma data_seg()一般用于DLL中

在DLL中定义一个共享的,有名字的数据段

最关键的是:这个数据段中的全局变量可以被多个进程共享。否则多个进程之间无法共享DLL中的全局变量

共享数据必须初始化,否则微软编译器会把没有初始化的数据放到.BSS段中,从而导致多个进程之间的共享行为失败

MyData段

进程

DLL

?

Windows 在一个Win32程序的地址空间周围筑了一道墙。通常,一个程序的地址空间中的数据是私有的,对别的

程序而言是不可见的。但是执行STRPROG的多个执行实体表示了STRLIB在程序的所有执行实体之间共享数据是

毫无问题的。当您在一个STRPROG窗口中增加或者删除一个字符串时,这种改变将立即反映在其它的窗口中。

在全部例程之间,STRLIB共享两个变量:一个字符数组和一个整数(记录已储存的有效字符串的个数)。STRLIB

将这两个变量储存在共享的一个特殊内存区段中:

#pragma????? data_seg ("shared")????????

?int ???iTotal = 0 ;????????

?WCHAR ?szStrings [MAX_STRINGS][MAX_LENGTH + 1] = { ‘‘ } ;?????????

?#pragma????? data_seg () ? ? ? ?

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

连结器必须知道有一个「shared」共享数据段。在「Project Settings」对话框选择「Link」页面卷标。选中「STRLIB」时在「Project Options」字段(在Release和Debug设定中均可),包含下面的连结叙述:

/SECTION:shared,RWS????????

字母RWS表示段具有读、写和共享属性。或者,您也可以直接用DLL原始码指定连结选项,就像我们在STRLIB.C那样(《windows编程》教程动态链接库):

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读