Почему 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.

Другие вопросы по тегам