DllMain зависает при регистрации COM dll

Я пытаюсь зарегистрировать DLL-библиотеку COM с именем MixCenter.dll. Я обнаружил все DLL, от которых он зависит. Когда руководители используют DllMain в первый раз, он зависает и больше не возвращается. Это похоже на тупик, но я не вызываю LoadLibrary и никогда не выполняю DllMain. Есть ли другие причины такой ситуации? Вот как точно выглядит DllMain:

BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)  
{  
    switch(ul_reason_for_call)   
    {  
        case DLL_PROCESS_ATTACH:   
            g_hinstDLL = hModule;  
            LOG(INFO) <<"--------------Begin Logging--------------";  
            return DllEntryPoint((HINSTANCE)hModule, ul_reason_for_call, lpReserved);  
        case DLL_THREAD_ATTACH:   
            break;  
        case DLL_THREAD_DETACH:   
            break;  
        case DLL_PROCESS_DETACH:   
            LOG(INFO) << "--------------End Logging--------------";  
            break;  
    }   
    return true;  
}

Я регистрирую все выполнение с помощью Dependency Walker, основная часть журнала:

LoadLibraryExW("MixCenter.dll", 0x00000000, LOAD_WITH_ALTERED_SEARCH_PATH) called from "REGSVR32.EXE" at address 0x003920FF by thread 1.  
Loaded "MIXCENTER.DLL" at address 0x10000000 by thread 1.  Successfully hooked module.  
Loaded "MSVCR80.DLL" at address 0x6F250000 by thread 1.  Successfully hooked module.  
Loaded "D3D9.DLL" at address 0x6C130000 by thread 1.  Successfully hooked module.  
Loaded "D3D8THK.DLL" at address 0x73490000 by thread 1.  Successfully hooked module.  
Loaded "D3DX9_40.DLL" at address 0x69B00000 by thread 1.  Successfully hooked module.  
Loaded "MSVCP80.DLL" at address 0x71430000 by thread 1.  Successfully hooked module.  
DllMain(0x6F250000, DLL_PROCESS_ATTACH, 0x00000000) in "MSVCR80.DLL" called by thread 1.  
GetProcAddress(0x75C90000 [KERNEL32.DLL], "FlsAlloc") called from "MSVCR80.DLL" at address 0x6F253001 and returned 0x75CE8731 by thread 1.  
GetProcAddress(0x75C90000 [KERNEL32.DLL], "FlsGetValue") called from "MSVCR80.DLL" at address 0x6F25300E and returned 0x75CE0DC7 by thread 1.  
GetProcAddress(0x75C90000 [KERNEL32.DLL], "FlsSetValue") called from "MSVCR80.DLL" at address 0x6F25301B and returned 0x75CE2904 by thread 1.  
GetProcAddress(0x75C90000 [KERNEL32.DLL], "FlsFree") called from "MSVCR80.DLL" at address 0x6F253028 and returned 0x75CE2AD7 by thread 1.  
GetProcAddress(0x75C90000 [KERNEL32.DLL], "EncodePointer") called from "MSVCR80.DLL" at address 0x6F252BBC and returned 0x77603275 by thread 1.  
GetProcAddress(0x75C90000 [KERNEL32.DLL], "EncodePointer") called from "MSVCR80.DLL" at address 0x6F252BBC and returned 0x77603275 by thread 1.  
GetProcAddress(0x75C90000 [KERNEL32.DLL], "EncodePointer") called from "MSVCR80.DLL" at address 0x6F252BBC and returned 0x77603275 by thread 1.  
GetProcAddress(0x75C90000 [KERNEL32.DLL], "EncodePointer") called from "MSVCR80.DLL" at address 0x6F252BBC and returned 0x77603275 by thread 1.  
GetProcAddress(0x75C90000 [KERNEL32.DLL], "EncodePointer") called from "MSVCR80.DLL" at address 0x6F252BBC and returned 0x77603275 by thread 1.
GetProcAddress(0x75C90000 [KERNEL32.DLL], "EncodePointer") called from "MSVCR80.DLL" at address 0x6F252BBC and returned 0x77603275 by thread 1.
GetProcAddress(0x75C90000 [KERNEL32.DLL], "EncodePointer") called from "MSVCR80.DLL" at address 0x6F252BBC and returned 0x77603275 by thread 1.  
GetProcAddress(0x75C90000 [KERNEL32.DLL], "DecodePointer") called from "MSVCR80.DLL" at address 0x6F252C33 and returned 0x775FF050 by thread 1.  
GetProcAddress(0x75C90000 [KERNEL32.DLL], "InitializeCriticalSectionAndSpinCount") called from "MSVCR80.DLL" at address 0x6F259668 and returned 0x75CE0D2B by thread 1.  
GetProcAddress(0x75C90000 [KERNEL32.DLL], "EncodePointer") called from "MSVCR80.DLL" at address 0x6F252BBC and returned 0x77603275 by thread 1.  
GetProcAddress(0x75C90000 [KERNEL32.DLL], "DecodePointer") called from "MSVCR80.DLL" at address 0x6F252C33 and returned 0x775FF050 by thread 1.  
GetProcAddress(0x75C90000 [KERNEL32.DLL], "DecodePointer") called from "MSVCR80.DLL" at address 0x6F252C33 and returned 0x775FF050 by thread 1.  
GetProcAddress(0x75C90000 [KERNEL32.DLL], "DecodePointer") called from "MSVCR80.DLL" at address 0x6F252C33 and returned 0x775FF050 by thread 1.
GetProcAddress(0x75C90000 [KERNEL32.DLL], "DecodePointer") called from "MSVCR80.DLL" at address 0x6F252C33 and returned 0x775FF050 by thread 1.
GetProcAddress(0x75C90000 [KERNEL32.DLL], "DecodePointer") called from "MSVCR80.DLL" at address 0x6F252C33 and returned 0x775FF050 by thread 1.  
GetProcAddress(0x75C90000 [KERNEL32.DLL], "DecodePointer") called from "MSVCR80.DLL" at address 0x6F252C33 and returned 0x775FF050 by thread 1.    
GetProcAddress(0x75C90000 [KERNEL32.DLL], "DecodePointer") called from "MSVCR80.DLL" at address 0x6F252C33 and returned 0x775FF050 by thread 1.  
GetProcAddress(0x75C90000 [KERNEL32.DLL], "DecodePointer") called from "MSVCR80.DLL" at address 0x6F252C33 and returned 0x775FF050 by thread 1.  
GetProcAddress(0x75C90000 [KERNEL32.DLL], "DecodePointer") called from "MSVCR80.DLL" at address 0x6F252C33 and returned 0x775FF050 by thread 1.  
GetProcAddress(0x75C90000 [KERNEL32.DLL], "DecodePointer") called from "MSVCR80.DLL" at address 0x6F252C33 and returned 0x775FF050 by thread 1.
GetProcAddress(0x75C90000 [KERNEL32.DLL], "DecodePointer") called from "MSVCR80.DLL" at address 0x6F252C33 and returned 0x775FF050 by thread 1.  
GetProcAddress(0x75C90000 [KERNEL32.DLL], "DecodePointer") called from "MSVCR80.DLL" at address 0x6F252C33 and returned 0x775FF050 by thread 1.  
GetProcAddress(0x75C90000 [KERNEL32.DLL], "DecodePointer") called from "MSVCR80.DLL" at address 0x6F252C33 and returned 0x775FF050 by thread 1.
GetProcAddress(0x75C90000 [KERNEL32.DLL], "DecodePointer") called from "MSVCR80.DLL" at address 0x6F252C33 and returned 0x775FF050 by thread 1.
GetProcAddress(0x75C90000 [KERNEL32.DLL], "DecodePointer") called from "MSVCR80.DLL" at address 0x6F252C33 and returned 0x775FF050 by thread 1.  
GetProcAddress(0x75C90000 [KERNEL32.DLL], "EncodePointer") called from "MSVCR80.DLL" at address 0x6F252D3A and returned 0x77603275 by thread 1.  
GetProcAddress(0x75C90000 [KERNEL32.DLL], "DecodePointer") called from "MSVCR80.DLL" at address 0x6F252D4A and returned 0x775FF050 by thread 1.
GetProcAddress(0x75C90000 [KERNEL32.DLL], "IsProcessorFeaturePresent") called from "MSVCR80.DLL" at address 0x6F26A967 and returned 0x75CE0DD4 by thread 1.  
GetProcAddress(0x75BC0000 [MSVCRT.DLL], "_set_error_mode") called from "MSVCR80.DLL" at address 0x6F254447 and returned 0x75BD4A3D by thread 1.  
GetProcAddress(0x75BC0000 [MSVCRT.DLL], "?set_terminate@@YAP6AXXZP6AXXZ@Z") called from "MSVCR80.DLL" at address 0x6F254463 and returned 0x75BEEBB7 by thread 1.  
GetProcAddress(0x75BC0000 [MSVCRT.DLL], "_get_terminate") called from "MSVCR80.DLL" at address 0x6F25447F and returned NULL by thread 1. Error:  (127).
GetProcAddress(0x75C90000 [KERNEL32.DLL], "FindActCtxSectionStringW") called from "MSVCR80.DLL" at address 0x6F251DBE and returned 0x75CE18F9 by thread 1.  
GetProcAddress(0x75C90000 [KERNEL32.DLL], "GetSystemWindowsDirectoryW") called from "MSVCR80.DLL" at address 0x6F251F1A and returned 0x75CE0E64 by thread 1.  
DllMain(0x6F250000, DLL_PROCESS_ATTACH, 0x00000000) in "MSVCR80.DLL" returned 1 (0x1) by thread 1.  
DllMain(0x73490000, DLL_PROCESS_ATTACH, 0x00000000) in "D3D8THK.DLL" called by thread 1.  
DllMain(0x73490000, DLL_PROCESS_ATTACH, 0x00000000) in "D3D8THK.DLL" returned 1 (0x1) by thread 1.  
DllMain(0x6C130000, DLL_PROCESS_ATTACH, 0x00000000) in "D3D9.DLL" called by thread 1.  
DllMain(0x6C130000, DLL_PROCESS_ATTACH, 0x00000000) in "D3D9.DLL" returned 1 (0x1) by thread 1.  
DllMain(0x69B00000, DLL_PROCESS_ATTACH, 0x00000000) in "D3DX9_40.DLL" called by thread 1.  
DllMain(0x69B00000, DLL_PROCESS_ATTACH, 0x00000000) in "D3DX9_40.DLL" returned 1 (0x1) by thread 1.  
DllMain(0x71430000, DLL_PROCESS_ATTACH, 0x00000000) in "MSVCP80.DLL" called by thread 1.  
DllMain(0x71430000, DLL_PROCESS_ATTACH, 0x00000000) in "MSVCP80.DLL" returned 1 (0x1) by thread 1.  
DllMain(0x10000000, DLL_PROCESS_ATTACH, 0x00000000) in "MIXCENTER.DLL" called by thread 1.  

person Nickolas    schedule 11.04.2011    source источник


Ответы (1)


Есть много вещей, которые вы не можете делать в DllMain. Вы не только не можете вызвать LoadLibrary сами, но вы не можете сделать ничего, что могло бы вызвать вызов LoadLibrary, и регистрация COM-сервера звучит так, как будто в какой-то момент он легко может сделать LoadLibrary.

Но это еще не все, что вы не можете сделать в DllMain. Список длинный и сложный, поэтому часто лучше всего использовать двухэтапную схему инициализации, в которой DllMain просто устанавливает флаг, а затем какой-то другой код в вашей DLL выполняет сложную инициализацию. Этот "другой код" может быть другим потоком в вашей DLL, или это может быть просто функция Init(), которую вы вызываете из основных подпрограмм вашей DLL, когда они вызываются.

person John Dibling    schedule 11.04.2011
comment
Под вашим руководством я обнаружил части запрещенного списка DllMain: 1. не могу позвонить в User32. 2. нельзя использовать управление памятью CRT с динамической библиотекой. Думаю, это может объяснить странную ситуацию. - person Nickolas; 12.04.2011