MFC dll中对话框销毁的困惑

永夜星空 2011-04-11 09:51:14
MFC dll中创建了一个对话框,在dll宿主程序退出时销毁这个对话框。但是销毁时总是产生错误。我的代码如下


BOOL CRxsjDllApp::InitInstance()
{
CWinApp::InitInstance();
ppanel=new Panel; //这是对话框的类
ppanel->Create(IDD_DIALOG1);
::MessageBeep(0x40);
return TRUE;
}

int CRxsjDllApp::ExitInstance()
{
::MessageBeep(0x40); //先听到了声音,然后就弹出了错误信息
::Sleep(500);
ppanel->DestroyWindow(); //如果把这2行去掉就不出错,而且两行都必须去掉。但这样不就有泄露了吗
delete ppanel;
return CWinApp::ExitInstance();
}

不知道是什么原因。我的dll里什么都没做,对话框类也没增加什么代码,一切都是向导生成的。网上搜索到一些资料,但是也解决不了我的问题,难道这个问题不普遍吗。

我使用的是VS2008
...全文
150 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2011-04-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 liuhua1982 的回复:]

ppanel的hwnd有值,但是调用::IsWindow(ppanel->m_hWnd)返回FALSE
[/Quote]这说明内地对话框已经被销毁了
你试试在MainFrame的OnDestroy函数里销毁对话框
不要在进程推出的时候
Lactoferrin 2011-04-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 liuhua1982 的回复:]

是不是一个线程退出了,由它创建的许多对象也都随之被系统摧毁了?
[/Quote]
线程结束时它创建的窗口就没了
永夜星空 2011-04-12
  • 打赏
  • 举报
回复
通过大家的解释和多次测试,终于明白是为什么了。我的dll是被注入到其它进程里的,而实现注入的线程在注入成功后就退出了,而InitInstance是被实现注入的线程执行的,那么里面创建的窗口等对象(包括它创建的钩子,不过好象不包括它申请的内存空间)在它退出后就被系统自动销毁了。ExitInstance是在程序关闭的时候执行的,就造成了重复销毁。我的解决方法就是只在InitInstance里创建一个新的不退出的线程,并且由这个线程负责销毁工作。
永夜星空 2011-04-12
  • 打赏
  • 举报
回复
是不是一个线程退出了,由它创建的许多对象也都随之被系统摧毁了?
xiaopoy 2011-04-12
  • 打赏
  • 举报
回复
DoModel ()在哪儿呢?
DoModel ()是不是也是DLL的一个线程中来执行的?
这个很可能是造成问题的原因。 /:^)
不过你的问题描述很模糊,希望可以具体点说说
b245930557 2011-04-12
  • 打赏
  • 举报
回复
呵呵 我也是新手哈
我想应该是 创建对话框的问题,IsWindow(hwnd)是判断指定的hwnd句柄是否标识了一个存在的窗口
永夜星空 2011-04-11
  • 打赏
  • 举报
回复
ppanel的hwnd有值,但是调用::IsWindow(ppanel->m_hWnd)返回FALSE
HowToP2p 2011-04-11
  • 打赏
  • 举报
回复
出了什么错了?调试一下dll,ppanel的hwnd有值吗?
Dreadnought 2011-04-11
  • 打赏
  • 举报
回复
[Quote=引用楼主 liuhua1982 的回复:]
MFC dll中创建了一个对话框,在dll宿主程序退出时销毁这个对话框。但是销毁时总是产生错误。我的代码如下

C/C++ code

BOOL CRxsjDllApp::InitInstance()
{
CWinApp::InitInstance();
ppanel=new Panel; //这是对话框的类
ppanel->Create(IDD_DIA……
[/Quote]


nt CRxsjDllApp::ExitInstance()
{
::MessageBeep(0x40); //先听到了声音,然后就弹出了错误信息
::Sleep(500);
if(ppanel->DestroyWindow())
{
delete ppanel;
}
return CWinApp::ExitInstance();
}

改成这样试试

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧