DLL ExitInstance时,dialog内存泄露没办法解决吗?

会员 发布于 2012/08/20 11:54
阅读 993
收藏 0

老问题

DLL为标准共享VC6

本来调用AfxFreeLibrary是能解决这个问题的,但是问题是这个dll是采用远程注入(Inject)的方式,脱离当前程序运行的玩意。

当dll被卸载时,会调用ExitInstance这个函数,我在这个函数里面析构,

其它变量都能delete,但是delete m_pMainDlg;(一个非模CXXDlg)时,Debug提示无法调用DestroyWindow

然后立马断言报错,大意是Assert(pMap == null),也就是message map早已在exitinstance之前就销毁了

导致DestroyWindow和PostNcDestroy均无法使用Message通知,即使在PostNcDestroy函数里面写delete this也无果,因为message map优先销毁,这个函数压根无法调用

好吧,我只有不管了,不delete,卸载的时候DebugView只会爆内存泄露,本来该宿主程序退出时会自动卸载我的dll,内存泄露不算什么。也不会报错,

但是我现在要调试,要不停的远程注入,卸载该DLL(只能使用标准的FreeLibrary),由于内存泄露问题,卸载该DLL时,宿主程序崩溃,重新打开宿主程序又太麻烦,而只要没CDialog,卸载非常正常,子类化的句柄也能正常归还。

好吧,我只希望宿主程序在dll卸载时内存泄露的情况不要崩溃。

在DLL卸载时,析构CDialog难道是梦想

 

 

加载中
0
TrulyBelieve
TrulyBelieve

dll远程注入以后,创建一个非可见的非模态窗体hWnd

你想卸载dll时,先Send消息给hWnd,让它做些清理工作,至少可以让UI的东西解决UI的问题

然后再清理其他东西

不知是否有帮助。

会员
会员
试过,在ExitIntance时,SendMessage是非法的,PostMessage是无效的,就算PostThreadMessage也是无效的,因为message map已经被销毁,直接断言。个人是感觉ExitInstance时已经太迟了
0
TrulyBelieve
TrulyBelieve
我的意思是在调FreeLibrary之前执行UI清理,再走 ExitIntance
会员
会员
没办法,我只好写了远程执行行数的代码,现在可以运行在远端了。
TrulyBelieve
TrulyBelieve
@紫薯饼 : 其实哪个进程不重要,是否远程注入也不重要,dll使用共享内存,变量在所有加载dll进程中只有一份,你可以用一个进程控制另一个进程执行代码。
会员
会员
我的dll已经在远程了,我只能使用其它程序进行远程FreeLibrary,注意是远程,想调用其中的程序过程,必须远程执行汇编代码。看我也不会啊。
返回顶部
顶部