利用DLL在进程间共享数据
2012-10-11 15:55
435 查看
mark一下 怕以后又忘记了
Dll代码:
在DLL中我定义了一个全局变量.下面用测试代码试试看能不能利用这种方式实现共享.
测试代码:
分别用两个进程去load这个dll.如果能实现共享数据的话.那么第一次输出应该是globalint = 0.第二次输出应该是globalint = 5.
验证一下:
![](http://img.my.csdn.net/uploads/201210/11/1349941615_3679.jpg)
很明显这是两个硕大的0.说明利用全局变量的思想去共享是行不通的.
至于为什么失败.我觉得应该是Copy On Write(windows的写时复制的机制)在起作用吧.
说白了就是在跨进程共享数据的时候.如果某个一旦去写数据,系统会复制一份副本到自身的进程空间.
拿DLL来说:它里的代码和数据都是进程们共享的,如果某个进程要修改DLL 的数据.
系统会启用写时复制机制重新分出一块内存页面.复制一份数据到新分出来的页面.
启用预编译宏#pragma 添加共享段,告别COW
DLL代码:
用peid看看新创建的段:
![](http://img.my.csdn.net/uploads/201210/11/1349942347_6612.jpg)
已经创建成功了,再用测试代码看看结果吧:
Dll代码:
#include "stdafx.h" #include <stdio.h> int globalint = 0; BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { printf("globalint = %d \n",globalint); globalint = 5; return TRUE; }
在DLL中我定义了一个全局变量.下面用测试代码试试看能不能利用这种方式实现共享.
测试代码:
#include "stdafx.h" #include <windows.h> #include <string.h> #include <stdio.h> int main(int argc, char* argv[]) { HANDLE m_hDll; m_hDll=LoadLibraryA(".\\ShareDLL"); getchar(); return 0; }
分别用两个进程去load这个dll.如果能实现共享数据的话.那么第一次输出应该是globalint = 0.第二次输出应该是globalint = 5.
验证一下:
![](http://img.my.csdn.net/uploads/201210/11/1349941615_3679.jpg)
很明显这是两个硕大的0.说明利用全局变量的思想去共享是行不通的.
至于为什么失败.我觉得应该是Copy On Write(windows的写时复制的机制)在起作用吧.
说白了就是在跨进程共享数据的时候.如果某个一旦去写数据,系统会复制一份副本到自身的进程空间.
拿DLL来说:它里的代码和数据都是进程们共享的,如果某个进程要修改DLL 的数据.
系统会启用写时复制机制重新分出一块内存页面.复制一份数据到新分出来的页面.
启用预编译宏#pragma 添加共享段,告别COW
DLL代码:
#include "stdafx.h" #include <stdio.h> #pragma data_seg("ShareSec") int globalint = 0;//把globalint放入ShareSec段 #pragma data_seg() #pragma comment(linker,"/SECTION:ShareSec,RWS")//告诉编译器为ShareSec段添加共享段读写属性 BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { printf("globalint = %d \n",globalint); globalint = 5; return TRUE; }
用peid看看新创建的段:
![](http://img.my.csdn.net/uploads/201210/11/1349942347_6612.jpg)
已经创建成功了,再用测试代码看看结果吧:
![](http://img.my.csdn.net/uploads/201210/11/1349942311_9034.jpg)
相关文章推荐
- VC 利用DLL共享区间在进程间共享数据及进程间广播消息
- VC 利用DLL共享区间在进程间共享数据及进程间广播消息
- VC 利用DLL共享区间在进程间共享数据及进程间广播消息
- VC 利用DLL共享区间在进程间共享数据及进程间广播消息
- 【转】VC 利用DLL共享区间在进程间共享数据及进程间广播消息
- VC 利用DLL共享区间在进程间共享数据及进程间广播消息
- VC 利用DLL共享区间在进程间共享数据及进程间广播消息
- DLL入门浅析(5)——使用DLL在进程间共享数据
- DLL入门浅析(5)——使用DLL在进程间共享数据
- DLL入门浅析(5)——使用DLL在进程间共享数据
- DLL入门浅析(5)——使用DLL在进程间共享数据
- 利用内存映射文件在进程间共享数据
- DLL共享数据段,实现多进程数据共享总结
- DLL入门浅析(5)——使用DLL在进程间共享数据
- #pragma data_seg实现DLL进程间数据共享
- DLL入门浅析——使用DLL在进程间共享数据
- DLL入门浅析(5)——使用DLL在进程间共享数据
- 使用DLL在进程间共享数据
- 使用DLL在进程间共享数据
- DLL入门浅析(5)——使用DLL在进程间共享数据