捋一捋C++中的#pragma data_seg进程共享方法

Home / C++ MrLee 2016-6-2 3457

很久之前用到一次,不过时隔几年也渐渐的忘记了这个玩意儿。今天写程序的时候又遇到这种需求,然后无笔记可翻,又花了个把小时才弄好。如果早前有blog几分钟就搞定了,浪费时间。
首先pragma data_seg是针对dll动态链接库的,我今天犯的错误就是直接加载.lib静态库,然后发现总是没用,这里后面再讲为啥没用!先了解原理。
pragma data_seg是在内存中创建一个共享的内存段,这个区域的值是可以共享的。我们假设现在有C.DLL动态链接库,然后C被A.EXE和B.EXE同时加载,那么,他们之间就有了一个共享的区域,就是C.DLL创建的,在这个区域里面的变量啥的都是可以被对方访问,改写的!那么也就是说,如果A.EXE加载C.DLL,B.EXE不加载的话,那么B.EXE是不知道内存哪里有共享的位置自然也是不能读取或设置该区域的变量值,所以.lib静态库自然是不行滴!不知道大家看的懂不?如果不懂多看几遍,再或者我表达能力有待提升,哈哈……
那我们就实践操作,先创建一个dll工程,然后在cpp文件中添加以下共享区域代码
#pragma data_seg("shareddata")
HWND g_hWnd = NULL;
#pragma data_seg()
#pragma comment(linker,"/SECTION:shareddata,RWS")
创建好数据段,该段有一个句柄被共享,那么只是是加载了这个dll的程序都是可以正常访问/改写这个句柄的值。加载方式就简单了,直接LoadLibraryA加载,还可以通过GetProcAddress获取这个dll所提供的修改句柄函数更改句柄的值。下面放一个代码片段
	TCHAR path[512];
	GetCurrentDirectory(sizeof(path),path);
	lstrcat(path,DLL_NAME);
	hModule = LoadLibraryA(path);
	DLSetHwnd dl = (DLSetHwnd)GetProcAddress(hModule,"DLSetHwnd");
	dl(GetSafeHwnd());//设置当前句柄到DLL库
当然,在用的时候要先申明一下
typedef void (*DLSetHwnd)(HWND hWnd);
 

本文链接:https://www.it72.com/9430.htm

推荐阅读
最新回复 (0)
返回