您的位置:首页 > 其它

团灭Windows进程通信(三)——共享内存就是方便面

2016-12-20 22:36 926 查看
文章来源:http://blog.csdn.net/huanglong8/article/details/53770815

在Windows内核编程中,有提到过共享数据段的内容,如果朋友以为我是要说FileMap文件映射的话,那可就错了,因为我觉得既然要先说共享内存,就要先说最简单,使用最方便的一种方法。

在windows下编程,vs有提供给我们很多编译和链接指令,我同大家一样,知道但不熟知,这里大名鼎鼎的就是#pragma了,它是预处理器的一组语法,根绝不同的语法结构和参数可以帮助我们完成各项工作。最简单的共享内存,如下例:

#pragma data_seg("MyShare")
unsigned int flag = 0;
char mydata[32] = {0};
#pragma data_seg()

#pragma comment(linker, "/Section:MyShare,RWS")


语法说明:MyShare是你可以自定义的一种数据段名称,这个名称用来标识在data_seg关键字中间的内容存储的内存块名称。像flag和mydata这两个变量则会放到堆上,

它仅仅只是告诉编译器,以下的这些变量放在另外一个地方,那么要实现共享,还还需要告诉链接器,这片数据段是什么作用.

Section:MyShare,RWS指的是一种访问类型,RWS分别代表可读,可写,共享。在做一些API工具开发的时候,我们需要进行详细设置,以免哪个程序员破坏了数据导致程序异常。

data_seg以外的变量,是不被共享的,如果需要在data_seg意外进行设置共享数据,则需要用到以下语法

__declspec(allocate("MyShare")) char mydata[32] = {0};


allocate的作用主要是在参数MyShare内存段上,主动分配内存。这种做法也是为了可以跳开data_seg片的限制,在需要的代码段中进行设置。

此部分仅仅简单介绍了共享数据段的基础使用,有空时,可以再深入的了解下。

数据段共享注意

#pragma data_seg之间的变量必须是初始化的,否则将无法共享。

#pragma comment(linker 必不可少,它才是设置共享的开关。

如果这片内存没有被加载到进程中时,则会被释放

由于这种机制简单且方便,所以大部分程序员会将这部分共享放入到dll中,方便管理,方便维护,下一章我直接会用案例来实现AB进程聊天的需求。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  windows 通信