找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 3226|回复: 6

【VC】VC、VC++共享数据段实现进程之间共享数据

[复制链接]

1113

主题

1654

回帖

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
245
威望
744 点
宅币
24306 个
贡献
46222 次
宅之契约
0 份
在线时间
2302 小时
注册时间
2014-1-26
发表于 2014-3-30 21:52:54 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
当我写了一个程序,我希望当这个程序同时运行两遍的时候,两个进程之间能共享一些全局变量,怎么办呢?很简单,使用VC\VC++的共享数据段。
#pragma data_seg("foo")//建立一个叫“foo”的数据段
#pragma comment(linker,"/SECTION:foo,RWS")//设置段foo的属性为“可读可写共享”

int bar=0;//这些变量是共享的,不同的进程之间都可以访问到。
int bar233=1;
int foobar=9;
int foobar233=233;

#pragma data_seg()//恢复到正常段继续编程
像这样弄好之后,相同EXE不同的进程之间对上面四个全局变量的访问是共享的,比如某进程把bar的值改为2333333,那么在别的进程里面,bar的值都变成了2333333。
因为是同一个EXE,所以如果是不同的EXE,效果不同。比如a.exe有个共享数据段foo,b.exe也有共享数据段foo,虽然都有名字一样的共享数据段,但是它们之间并不会互相产生影响,因为EXE不一样。(EXE名不一样或EXE内容不一样)
大家可能有个问题,不同的EXE之间怎么做到共享数据?其实很简单,我们用DLL实现这个功能。
让DLL也弄一个这样的共享数据段,然后让不同的EXE一起载入这个DLL,就能实现不同的EXE之间共享数据了。
回复

使用道具 举报

55

主题

276

回帖

9364

积分

用户组: 管理员

UID
77
精华
16
威望
237 点
宅币
8228 个
贡献
251 次
宅之契约
0 份
在线时间
256 小时
注册时间
2014-2-22
发表于 2014-3-30 22:20:07 | 显示全部楼层
这个技巧非常实用。

另外,为了方便搜索引擎收录,请把你所有帖子的C艹改为C++。

点评

谢谢提醒。虽然我一直很喜欢C艹这个称呼。。。  详情 回复 发表于 2014-3-30 22:22
回复 赞! 靠!

使用道具 举报

1113

主题

1654

回帖

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
245
威望
744 点
宅币
24306 个
贡献
46222 次
宅之契约
0 份
在线时间
2302 小时
注册时间
2014-1-26
 楼主| 发表于 2014-3-30 22:22:23 | 显示全部楼层
美俪女神 发表于 2014-3-30 14:20
这个技巧非常实用。

另外,为了方便搜索引擎收录,请把你所有帖子的C艹改为C++。 ...

谢谢提醒。虽然我一直很喜欢C艹这个称呼。。。
回复 赞! 靠!

使用道具 举报

0

主题

1

回帖

19

积分

用户组: 初·技术宅

UID
135
精华
0
威望
1 点
宅币
16 个
贡献
0 次
宅之契约
0 份
在线时间
1 小时
注册时间
2014-3-20
发表于 2014-3-31 00:26:18 | 显示全部楼层
这就是R3与R0的区别,R0可以自由的共享进程以及内存。

点评

R0看到的是物理内存,R3看到的是线性内存  详情 回复 发表于 2014-3-31 13:39
回复 赞! 靠!

使用道具 举报

1113

主题

1654

回帖

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
245
威望
744 点
宅币
24306 个
贡献
46222 次
宅之契约
0 份
在线时间
2302 小时
注册时间
2014-1-26
 楼主| 发表于 2014-3-31 13:39:49 | 显示全部楼层
随时受不了 发表于 2014-3-30 16:26
这就是R3与R0的区别,R0可以自由的共享进程以及内存。

R0看到的是物理内存,R3看到的是线性内存
回复 赞! 靠!

使用道具 举报

55

主题

276

回帖

9364

积分

用户组: 管理员

UID
77
精华
16
威望
237 点
宅币
8228 个
贡献
251 次
宅之契约
0 份
在线时间
256 小时
注册时间
2014-2-22
发表于 2014-4-5 23:24:16 | 显示全部楼层
0xAA55 发表于 2014-3-31 13:39
R0看到的是物理内存,R3看到的是线性内存

此言差矣。。。

内核内存(WIN32的0x80000000以上和WIN64的0xFFFFF80000000000以上)也是虚拟内存。

如果要直接读写某段物理内存(比如0x123456),需要用MmMapIoSpace来把这段内存映射为虚拟内存才行。。。

点评

そうか。。谢指教!  详情 回复 发表于 2014-4-5 23:47
回复 赞! 靠!

使用道具 举报

1113

主题

1654

回帖

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
245
威望
744 点
宅币
24306 个
贡献
46222 次
宅之契约
0 份
在线时间
2302 小时
注册时间
2014-1-26
 楼主| 发表于 2014-4-5 23:47:50 | 显示全部楼层
美俪女神 发表于 2014-4-5 15:24
此言差矣。。。

内核内存(WIN32的0x80000000以上和WIN64的0xFFFFF80000000000以上)也是虚拟内存。

そうか。。谢指教!
回复 赞! 靠!

使用道具 举报

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-5-16 03:54 , Processed in 0.053648 second(s), 37 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表