我有一个dll,它实际上是一个已注册的com服务,然后由另一个.exe进程加载。我希望当用户从.exe退出时,在我的dll中执行一些资源关闭步骤之前为时已晚。我试图从我的DLL的DllMain拦截DLLPROCESSDETACH或DLLTHREADDETACH,但是当它到达那里时,由于我的DLL启动的线程(我需要执行关闭步骤)已经停止了已经太迟了?!当然,我不控制.exe代码,否则我会调用它来执行那些干净的关闭步骤,然后退出。我只能处理DLL本身。似乎DllCanUnloadNow或DllUnregisterServer都没有被调用。
有没有人可以解决这种情况?
提前感谢您提供任何意见。
答案 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()函数。