利用DLL在进程间共享数据

mark一下 怕以后又忘记了


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.

验证一下:


很明显这是两个硕大的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看看新创建的段:



已经创建成功了,再用测试代码看看结果吧:



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值