通过IIS应用程序池w3wp.exe调用COM DLL时未调用DLL_THREAD_ATTACH

时间:2016-01-12 14:31:08

标签: c++ windows visual-studio-2015

我在我的COM DLL中收到一些 DLL_THREAD_ATTACH通知,但是从应用池工作线程 none ,实际调用了我的COM DLL。< / p>

随后,从IIS启动的DLL调用到达从未调用DLL_THREAD_ATTACH的线程。

当DLL附加到dllhost.exe时(通过DLL_PROCESS_ATTACH),只通知应用程序池的第一个线程。

这是缺陷还是功能,是否有解决方法?

1 个答案:

答案 0 :(得分:2)

DLL_THREAD_ATTACH经常被误解。您没有提供足够的信息,但很可能是您的问题是由于:

来自MSDN documentation,强调我的:

  

DLL_THREAD_ATTACH | 当前流程正在创建新主题

在同一页面上:

  

在某些情况下,即使从未使用DLL_THREAD_ATTACH为该线程调用入口点函数,也会为终止线程调用入口点函数:

     
      
  • 线程是进程中的初始线程,因此系统使用DLL_PROCESS_ATTACH值调用入口点函数。
  •   
  • 线程在调用LoadLibrary函数时已经在运行,因此系统从未调用它的入口点函数
  •   

要解决此问题,您可以在DLL_PROCESS_ATTACH时手动枚举进程的每个线程。在新线程上调用DLL函数时,也可以首次执行init。显然,如果可能的话,你也可以在加载DLL之后创建线程。