2009-10-18 83 views
2

我有一个DLL,它实际上是一个com服务,它已被注册,然后被另一个.exe进程加载。我希望当用户退出.exe执行某些资源关闭步骤时,我的dll才为时过晚。我尝试从我的DLL的DllMain中截取DLLPROCESSDETACH或DLLTHREADDETACH,但似乎当它到达时,它已经太晚了,因为我的DLL(我需要执行关闭步骤)开始的线程已经停止了?!当然,我不控制.exe代码,否则我会从那里调用一个调用来执行那些干净的关闭步骤,然后退出。我只能在DLL本身上工作。它似乎并没有调用DllCanUnloadNow或DllUnregisterServer。我如何知道加载我的DLL的.exe文件即将退出?

有没有人为这种情况解决?

非常感谢您的任何投入。

回答

1

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

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

static CDtorMyDll dtorMyDll; 
+0

不起作用,因为它们是从'DLLPROCESSDETACH' – MSalters 2010-07-13 14:20:06

0

愚蠢的问题:为什么你需要运行你创建的线程?无论如何,它们将被销毁,并且流程使用的所有资源都会清理干净。尽管如此,如果您的对象确实是一个COM对象,您可以将代码添加到您的DllCanUnloadNow调用中,以检测对象中是否有未完成的实例,如果没有,则清理您的资源。如果进程泄漏对对象的引用或不调用CoUninitialize,但这不起作用,但如果托管对象的进程遵循规则,则会在进程关闭之前为您提供清理的机会。

0

试图通过DllMain或析构函数来做到这一点会导致怪异,因为DLL本身将处于一种奇怪的状态(阅读Raymond Chen关于DllMain的所有文章,你会看到)。

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

相关问题