DoModal、CreateDialogIndirect运行报错误问题

转自:http://hi.baidu.com/caibirdy1985/item/2f5ae079452b31347044235e

 

在DoModal中主要对窗体包含的类做初始化,但这个部分的代码是属于MFC内部封装的,

大部分人会感到措手不及,甚至疑问是否MFC框架出现BUG,不可否认MFC存在一些缺点,

但缺点并不是BUG,关于这个地方会报错,调进去后可发现大部分是非法引用句柄、控件变量、资源等等,

但由于工程编译没问题,只在运行时报错,因此可能排错比较麻烦,经调试,

有以下几类原因:

1)由于窗体原来的某个组件删掉了,相应的资源也没了,但相关的变量却没有删除,导致程序运行时引用的变量无非找不到资源而报错。

2)同样是某个组件删掉了,但在一些手动代码中引用资源号而报错。

3)使用原生API创建多线程CreateThread,并在子线程中引用主线程的窗体资源,MFC需要使用窗体线程类来实现多线程操作。

这里说明一下,多线程是一个连具有几十年的开发操作系统经验的工程师都需要不断学习的知识点,

每一个开发框架都会提供一个类似BeginThread的函数,该函数对系统多线程API进行封装,同时设置框架内部的一些系统变量,

这些系统变量会影响内存管理器的工作模式,如果直接使用CreateThread,框架就没有这些功能,会导致使用的框架不是多线程模

式的,最终导致即使两个在地址上相差很“远”的全局变量都会互相影响,不管是MFC还是delphi的VCL,都一样,这是内存管理器

实现时的一个折中方案,需要通过BeginThread来避免,当然BeginThread是较低层的函数,而面向对象的框架都一般会提供一

系列的线程类供不同场景使用。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值