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

解决方案 »

  1.   

    不好意思,原来是在DLL_PROCESS_ATTACH中进行了关键代码段的初始化,在DLL_PROCESS_DETACH中释放关键代码段的内存的。可是在DLL_PROCESS_ATTACH后加了一个break,却忘了在DLL_THREAD_DETACH后加上一个break。从而导致DLL_THREAD_DETACH后错误的执行了DLL_PROCESS_DETACH释放内存,然后下一次调用关键代码段时就出错了。CRITICAL_SECTION  g_Lock;
    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;
    }