Почему DLL_THREAD_DETACH происходит дважды?

Я учу COM. Я написал простой компонент COM в DLL и зарегистрировал его в реестре. Затем я создал простой клиент и попытался использовать мой COM-компонент. Но я не понимаю DllMain поведение (читаю этот также).

extern "C" BOOL WINAPI DllMain(
_In_ HINSTANCE hinstDLL,
_In_ DWORD     fdwReason,
_In_ LPVOID    lpvReserved){
pDll = hinstDLL;
if (DLL_PROCESS_ATTACH == fdwReason){
trace("DllMain(): DLL_PROCESS_ATTACH");
}
else if (DLL_THREAD_ATTACH == fdwReason){
trace("DllMain(): DLL_THREAD_ATTACH");
}
else if (DLL_PROCESS_DETACH == fdwReason){
trace("DllMain(): DLL_PROCESS_DETACH");
}
else if (DLL_THREAD_DETACH == fdwReason){
trace("DllMain(): DLL_THREAD_DETACH");
}
else{
trace("DllMain(): unknown variant...");
}
return TRUE;
}

Я ожидал для каждого DLL_PROCESS_ATTACH один DLL_PROCESS_DETACH быть призванным и для каждого DLL_THREAD_ATTACH один DLL_THREAD_DETACH быть вызванным (если исключение не происходит).

Но я вижу для одного DLL_PROCESS_ATTACH есть два DLL_THREAD_DETACH:

введите описание изображения здесь

Почему это происходит?

1

Решение

Около DLL_THREAD_ATTACH :

Обратите внимание, что функция точки входа DLL вызывается с этим значением только потоками, созданными после загрузки DLL процессом. Когда DLL загружается с использованием LoadLibrary, существующие потоки не вызывают функцию точки входа вновь загруженной DLL.

Там нет никакой связи между количеством DLL_THREAD_ATTACH а также DLL_THREAD_DETACH, Это все о времени загрузки и создания. Когда поток создается во время загрузки DLL, DLL_THREAD_ATTACH будет называться. Когда поток завершается во время загрузки DLL, DLL_THREAD_DETACH будет называться. DLL никогда не будет вытеснена потоком, поэтому вызовы THREAD могут происходить только при создании и завершении потока.

В вашем случае в журнале говорится только о том, что вы не создали поток после загрузки DLL, но два потока вышли из него до выгрузки DLL.

6

Другие решения


По вопросам рекламы [email protected]