0xAA55 发表于 2014-3-30 21:52:54

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

当我写了一个程序,我希望当这个程序同时运行两遍的时候,两个进程之间能共享一些全局变量,怎么办呢?很简单,使用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之间共享数据了。

Golden Blonde 发表于 2014-3-30 22:20:07

这个技巧非常实用。

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

0xAA55 发表于 2014-3-30 22:22:23

美俪女神 发表于 2014-3-30 14:20
这个技巧非常实用。

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

谢谢提醒。虽然我一直很喜欢C艹这个称呼。。。

随时受不了 发表于 2014-3-31 00:26:18

这就是R3与R0的区别,R0可以自由的共享进程以及内存。

0xAA55 发表于 2014-3-31 13:39:49

随时受不了 发表于 2014-3-30 16:26
这就是R3与R0的区别,R0可以自由的共享进程以及内存。

R0看到的是物理内存,R3看到的是线性内存

Golden Blonde 发表于 2014-4-5 23:24:16

0xAA55 发表于 2014-3-31 13:39
R0看到的是物理内存,R3看到的是线性内存

此言差矣。。。

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

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

0xAA55 发表于 2014-4-5 23:47:50

美俪女神 发表于 2014-4-5 15:24
此言差矣。。。

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


そうか。。谢指教!
页: [1]
查看完整版本: 【VC】VC、VC++共享数据段实现进程之间共享数据