Я учу 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
:
Почему это происходит?
Около 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.