本站教程收集整理的这篇文章主要介绍了我怎么知道加载我的DLL即将退出的.exe。,本站教程本站觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个dll,这实际上是一个COM服务注册,然后由另一个.exe进程加载。 我想当用户退出.exe执行一些资源closures步骤从我的DLL之前,为时已晚。 我尝试从我的DLL的DllMain拦截DLLPROCESSDETACH或DLLTHREADDETACH,但似乎当它到达那里,已经太迟,因为我的DLL(我需要执行closures的步骤)已经停止的线程开始? 当然,我不控制.exe代码,否则我会从那里调用执行那些干净的closures步骤,然后退出。 我只能在DLL本身上工作。 它似乎并没有调用DllCanUnloadNow或DllUnregisterServer。
有没有人为这种情况工作?
提前感谢您的任何投入。
自动退出Telnet命令返回提示,无需人工干预^]退出closures退出码1
执行asynchronousI / O操作时退出
如何避免在C中的我的容器服务器的用户定义库程序中的“退出”?
终止应用程序并调用本地对象的析构函数
是否有可能在线程中使用退出?
exit()和exit_group()有什么区别
C ++ Windows:如何closures控制台窗口?
程序退出状态
在UNIX(或LINUX)中退出并等待函数
exit()vs _exit():调用_exit()是否确保closures所有打开的fd和套接字?
你可以用dtor写一个静态对象,当服务正在退出,cruntime即将卸载时,dtor将被调用。
struct CDtorMyDll { ~CDtorMyDll { // do cleanup stuff here. } }; static CDtorMyDll dtorMyDll;
愚蠢的问题:为什么你需要运行你创建的线程? 无论如何它们将被销毁,并且清理所有流程使用的资源。
话虽如此,如果您的对象确实是一个COM对象,您可以添加代码到您的DllCanUnloadNow调用来检测是否有任何未完成的对象的实例,如果没有,清理您的资源。 如果进程泄漏对象的引用或不调用CoUninitialize,这将不起作用,但是如果托管对象的进程遵循规则,那么在进程关闭之前,您将有机会进行清理。
试图通过DllMain或析构函数来做到这一点会导致怪异的,因为DLL本身将处于一个奇怪的状态(阅读所有雷蒙德陈关于DllMain的文章,你会看到)。
真正的解决方案是在进程退出之前调用明确的MyDllInitialize()和MyDllTeardown()函数。
本站总结
以上是本站教程为你收集整理的我怎么知道加载我的DLL即将退出的.exe。全部内容,希望文章能够帮你解决我怎么知道加载我的DLL即将退出的.exe。所遇到的程序开发问题。
如果觉得本站教程网站内容还不错,欢迎将本站教程推荐给好友。
本图文内容来源于网友网络香港vps收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。