非模态对话框的释放

    这两天搞了个框架,采用轮询调用dll的模式实现软件功能的模块化;但是在使用多线程显示非模态对话框的时候却不太理想。

    花了半天时间找到了问题,由于多线程没有互斥,导致在new 的时候重复分配;这个问题解决之后,突然发现用的不是debug版本;于是乎修改设置进行debug,引起了一堆的问题。

    问题较多,但是主要是内存泄露;内存泄露也不影响使用,因为不是循环泄露,而是资源没有释放;

    既然找到了问题就解决吧,两天的磨难开始了......

    释放加上了,开始出现debug断言;各种方法都没有效果,甚至包括将回调函数改为消息、重新写了一遍基础框架等;没办法只能一句一句的跟代码;

    原来还是笨办法管用,很快找到了问题:调用dll内的接口函数释放dll中的非模态窗口时出现的断言错误,主要有wincore954和wincore1073这两个错误;后来还有heapfree错误;反正错误都不是提示在工程代码里。

    经过各种搜索,最后定位在delete  上;缩小范围后,找到了很多解决方案,尼玛就没一个有效果的:

模态对话框与非模态对话的几种销毁方法与区别
非模态对话框的销毁
VC非模态对话框创建和销毁

    统统没有效果,难道你们遇到的问题都解决了?还是你们没有用dll调用非模态窗体??

    平心而论,也不是没有收获,所有人都提到:CMyDialog::PostNcDestroy() { CDialog::PostNcDestroy(); delete this; }

 但是最最关键的问题却避而不谈,是不是想藏着掖着??没办法,只能去msdn上看看了。看msdn还是要用迭代法,先读懂每一个单词,然后再将单词

组成句子,幸好不复杂,很简单的点明了:We recommend that you call DestroyWindow to destroy a Windows object, either the C++ method or the global DestroyWindow API.

  就这一句话,再加上之前的PostNcDestroy,彻底解决了问题。希望能对你有帮助。

 虽然啰里啰嗦的写了一篇,关键就是两句话的事,权当我发发牢骚。

补充一点:一定是 DestroyWindow(pMyDialog),而不是pMyDialog->DestroyWindow();为啥没深究


附:https://msdn.microsoft.com/en-us/library/5zba4hah.aspx




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值