这个DLL的特性就是: 多个应用都会从这个DLL中获取数据, 这个数据由第一次调用DLL时分配但是什么时候释放呢?//定义全局共享数据段
#pragma data_seg("ALL_Devide")Device *g_AllDevice= NULL; //全局的数据
int m_nRef=0;#pragma data_seg()
#pragma comment (linker,"/SECTION:ALL_Devide,RWS")
当第一次使用后, 然后给这个变量分配了内存当所有调用者都结束(我定义了一个计数器), 然后释放内存
现在的问题是:
1. 碰到有人说全局数据段不能有指针 或者说是动态分配内存的变量???
的值D L L _ P R O C E S S _ D E TA C H。当D L L处理这个值时,它应该执行任何与进程相关的清除操
作。
请参考<<windows核心编程>>20章
#ifdef __cplusplus
#define EXPORT extern "C" __declspec (dllexport)
#else
#define EXPORT __declspec (dllexport)
#endifEXPORT BOOL CALLBACK Show();////////////TestDll.cpp
#include "TestDll.h"
#pragma data_seg ("shared")
char *pszCharTest = NULL;
#pragma data_seg ()#pragma comment(linker,"/SECTION:shared,RWS")BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
pszCharTest = new char[10];
break;
case DLL_PROCESS_DETACH:
delete []pszCharTest;
break;
default:
break;
}
return TRUE;
}EXPORT BOOL CALLBACK Show()
{
strcpy(pszCharTest,"Ok");
MessageBox(NULL,pszCharTest,"",1);
return 1;
}测试一下,可以证明Dll有自己的内存空间,动态分配的内存和调用进程无关,可通过共享数据段定义的指针访问.没发现不对的地方
您可以通过几个方式来验证:
1、将共享的DLL编译成两份文件,修改每个文件的默认装载地址,然后运行看看结果。
2、测试的两个进程中多装载几个DLL文件,并且使装在它们的顺序在每个EXE中不同。
如果在exe里,指针指向exe空间的地址,其它调用此dll的进程访问指针指向的内容时会出错
如果在dll里,指针指向dll空间的地址,这时访问则正常不知是不是这么回事,还请高人解答
至于楼上说的“如果在dll里,指针指向dll空间的地址,这时访问则正常”,也是会有错误的。因为指针是所有进程共享的,而DLL的映射地址在不同进程中可能是不同的,虽然最佳地址是0x10000000,但是如果该地址被占用,则系统会选择其他的地址并对DLL中的地址引用做修改。因此,不能保证所有进程访问该共享全局指针变量所指的地址对所有的进程空间来说都有效。如果出现访问正常,也只是说明该DLL被多个进程映射到相同的地址而已,是不安全的。
因此,在共享段中,还是只存放一般类型的变量好。
我在dllmain中给它赋了值,我只是把它做为参数给SetWindowsHookEx,回来它就变了!!晕~~
这是怎么会事啊?
更怪的是,这个hinstance指向一个进程的,它变了,那个进程居然没事??不过好像有几次也出事了!这又是怎么回事?
跨进程访问指针,或者说内存地址是不安全的。