1

我正在学习 COM。我在 DLL 中编写了一个简单的 COM 组件,并在注册表中注册了它。然后我创建了一个简单的客户端并尝试使用我的 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_ATTACHDLL_PROCESS_DETACH都被调用,并且每个DLL_THREAD_ATTACHDLL_THREAD_DETACH都被调用(如果没有发生异常)。

但我看到一个DLL_PROCESS_ATTACH有两个DLL_THREAD_DETACH

在此处输入图像描述

为什么会这样?

4

1 回答 1

8

关于DLL_THREAD_ATTACH

请注意,只有在进程加载 DLL 后创建的线程才能使用此值调用 DLL 的入口点函数。使用 LoadLibrary 加载 DLL 时,现有线程不会调用新加载的 DLL 的入口点函数。

DLL_THREAD_ATTACH和的数量没有关系DLL_THREAD_DETACH。这都是关于加载和创建时间的。在加载 DLL 时创建线程时,DLL_THREAD_ATTACH将调用该线程。当加载 DLL 时线程退出时,DLL_THREAD_DETACH将被调用。线程永远不会被 DLL 抢占,因此 THREAD 调用只能在线程创建和结束时发生。

在您的情况下,日志仅表明您在加载 DLL 后没有创建线程,但在卸载 DLL 之前退出了两个线程。

于 2015-06-04T07:48:57.110 回答