我怎么知道加载我的dll的.exe即将退出?

时间:2009-10-18 16:24:58

标签: windows com dll exit

我有一个dll,它实际上是一个已注册的com服务,然后由另一个.exe进程加载。我希望当用户从.exe退出时,在我的dll中执行一些资源关闭步骤之前为时已晚。我试图从我的DLL的DllMain拦截DLLPROCESSDETACH或DLLTHREADDETACH,但是当它到达那里时,由于我的DLL启动的线程(我需要执行关闭步骤)已经停止了已经太迟了?!当然,我不控制.exe代码,否则我会调用它来执行那些干净的关闭步骤,然后退出。我只能处理DLL本身。似乎DllCanUnloadNow或DllUnregisterServer都没有被调用。

有没有人可以解决这种情况?

提前感谢您提供任何意见。

3 个答案:

答案 0 :(得分:1)

你可以用dtor写一个静态对象,一旦服务退出就会调用dtor,并且cruntime即将卸载。

struct CDtorMyDll
{
  ~CDtorMyDll
  {
    // do cleanup stuff here.
  }
};

static CDtorMyDll dtorMyDll;

答案 1 :(得分:0)

愚蠢的问题:为什么你需要运行你创建的线程?无论如何它们都将被销毁,并且流程使用的所有资源都被清理干净。

话虽如此,如果您的对象确实是COM对象,您可以向DllCanUnloadNow调用添加代码以检测对象是否有任何未完成的实例,如果没有,则清理资源。如果进程泄漏对象的引用或者不调用CoUninitialize,则无效,但如果托管对象的进程遵循规则,则可以在进程关闭之前清理它。

答案 2 :(得分:0)

尝试通过DllMain或析构函数执行此操作将导致奇怪,因为DLL本身将处于一种奇怪的状态(阅读Raymond Chen关于DllMain的所有文章,你会看到)。

这里真正的解决方案是在进程退出之前调用显式的MyDllInitialize()和MyDllTeardown()函数。