【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之间共享数据了。 这个技巧非常实用。
另外,为了方便搜索引擎收录,请把你所有帖子的C艹改为C++。 美俪女神 发表于 2014-3-30 14:20
这个技巧非常实用。
另外,为了方便搜索引擎收录,请把你所有帖子的C艹改为C++。 ...
谢谢提醒。虽然我一直很喜欢C艹这个称呼。。。 这就是R3与R0的区别,R0可以自由的共享进程以及内存。 随时受不了 发表于 2014-3-30 16:26
这就是R3与R0的区别,R0可以自由的共享进程以及内存。
R0看到的是物理内存,R3看到的是线性内存 0xAA55 发表于 2014-3-31 13:39
R0看到的是物理内存,R3看到的是线性内存
此言差矣。。。
内核内存(WIN32的0x80000000以上和WIN64的0xFFFFF80000000000以上)也是虚拟内存。
如果要直接读写某段物理内存(比如0x123456),需要用MmMapIoSpace来把这段内存映射为虚拟内存才行。。。 美俪女神 发表于 2014-4-5 15:24
此言差矣。。。
内核内存(WIN32的0x80000000以上和WIN64的0xFFFFF80000000000以上)也是虚拟内存。
そうか。。谢指教!
页:
[1]