我在C的动态链接库中声明了一个全局变量CRITICAL_SECTION g_Lock;//关键代码段,这个全局变量只在动态链接库的函数中使用,其中初始化临界区和释放临界区分别在动态连接库被进程加载和卸载时执行。编译时选择8bit对齐,多线程模式,然后在Delphi中采用cdecl隐式加载。但是在调试运行中发现g_Lock的LockCount会莫名其妙的被修改从而导致Ntdll.dll非法写内存地址0x10从而导致错误。Delphi中的代码在调用动态链接库时的入口参数是正确的,有时候刚进到动态链接库内执行了一些判断、ZeroMemory、赋值等操作(没有任何内存越界的行为)就发现LockCount被偷偷的修改了,我究竟惹了谁?
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{ switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
InitializeCriticalSection(&g_Lock);
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
DeleteCriticalSection(&g_Lock);
break;
}
return TRUE;
}