#pragma data_seg实现DLL进程间数据共享
2008-09-15 19:58
435 查看
#pragma data_seg( [ [ { push | pop }, ] [ identifier, ] ] [ "segment-name" [, "segment-class" ] ) |
1,#pragma data_seg()一般用于DLL中。也就是说,在DLL中定义一个共享的,有名字的数据段。最关键的是:这个数据段中的全局变量可以被多个进程共享。否则多个进程之间无法共享DLL中的全局变量。
2,共享数据必须初始化,否则微软编译器会把没有初始化的数据放到.BSS段中,从而导致多个进程之间的共享行为失败。
3,你所谓的结果正确是一种错觉。如果你在一个DLL中这么写:
#pragma data_seg("MyData")
int g_Value; // Note that the global is not initialized.
#pragma data_seg()
DLL提供两个接口函数:
int GetValue()
{
return g_Value;
}
void SetValue(int n)
{
g_Value = n;
}
然后启动两个进程A和B,A和B都调用了这个DLL,假如A调用了SetValue(5); B接着调用int m = GetValue(); 那么m的值不一定是5,而是一个未定义的值。因为DLL中的全局数据对于每一个调用它的进程而言,是私有的,不能共享的。假如你对g_Value进行了初始化,那么g_Value就一定会被放进MyData段中。换句话说,如果A调用了SetValue(5); B接着调用int m = GetValue(); 那么m的值就一定是5!这就实现了跨进程之间的数据通信!
// pragma_directive_data_seg.cpp int h = 1; // stored in .data int i = 0; // stored in .bss 等于0和没初始化的一样 int s; // stored in .bss #pragma data_seg(".my_data1") int j = 1; // stored in "my_data1" #pragma data_seg(push, stack1, ".my_data2") int l = 2; // stored in "my_data2" #pragma data_seg(pop, stack1)// pop stack1 off the stack一直弹出栈,直到弹出identifier为stack1的为止;stored in "stack_data1" int m = 3; int main() { }
相关文章推荐
- 同一个dll被多个进程使用的数据共享(Data_seg)
- #pragma data_seg在DLL中共享数据的应用
- dll与程序间的数据共享(#pragma data_seg())
- #pragma data_seg共享数据使用说明
- DLL共享数据段,实现多进程数据共享总结
- DLL共享数据段,实现多进程数据共享总结
- #pragma data_seg在DLL中共享数据的应用
- Dll的各进程之间共享-#pragma data_seg预处理指令用于设置共享数据段
- Dll的各进程之间共享-#pragma data_seg预处理指令用于设置共享数据段
- 通过#pragma data_seg共享数据
- #pragma data_seg 共享数据区(转)
- 进程共享变量#pragma data_seg用法 / 数据共享/进程通信
- #pragma data_seg() 在进程通信或数据共享上的用法总结
- #pragma data_seg在DLL中共享数据的应用
- DLL共享数据段,实现多进程数据共享总结
- 共享内存实现进程间大数据的交换
- 共享内存实现进程间数据的交换
- 进程共享变量#pragma data_seg用法
- VC 利用DLL共享区间在进程间共享数据及进程间广播消息
- VC 共享内存实现进程间大数据的交换