CDilog::DoModal调用失败,原因分析
来源:互联网 发布:淘宝比价软件app 编辑:程序博客网 时间:2024/05/17 04:09
转载:http://baike.baidu.com/link?url=usfpIm2pHh2DaVtq8SQtdQVkzzED8dbAOic1vUh3ar6cQv3UHwbLilOlKWaEZy-1LaUAY56nTJY3eUn_g20i9_
DoModal()函数调用失败的原因分析:对话框DoModal()函数调用失败一般而言有两种表现形式:一是对话框弹不出来,但是没有错误提示; 二是对话框弹不出来,同时伴随内存访问错误的提示框出现。 第一种表现主要是因为没有对资源句柄进行切换造成的,以在DLL中弹出对话框中最为常见。解决办法是:如果是MFC规则DLL,可以使用所有导出函数的开始处添加 AFX_MANAGE_STATE宏,具体代码为:AFX_MANAGE_STATE(AfxGetStaticModuleState( ))。如果是MFC扩展DLL,具体做法是 1. 在DLL中定义两个全局变量, HINSTANCE hResOld; // 旧的资源句柄 HINSTANCE hDll; // DLL资源句柄 2. 在DllMain函数里初始化hDll hDll = hInstance; 3. 在调用对话框DoModal()函数之前进行资源句柄切换 HINSTANCE hResOld = AfxGetResourceHandle(); AfxSetResourceHandle(hDll); …… CYourDlg dlg; dlg.DoModal(); …… AfxSetResourceHandle(hResOld);
若是第二种表现,即对话框弹不出来,同时伴随内存访问错误的提示框出现,那么问题很可能出现在初始化对话框界面的代码方面,具体是在OnInitDialog函数,即使它是在DLL中弹出对话框。事实上在在DLL中弹出对话框如果不进行资源句柄切换,顶多是弹不出对话框,并不会出现内存访问方面的错误。在解决这方面的错误,一个误区是单步进入DoModal()函数调试,直至定位DoModal函数内部哪一句出错。后来我发现这纯粹是浪费时间,就算定位了在DoModal函数内部哪一句出错,你依然不知道为什么会出错。实际上调用DoModal()函数,激发的却是OnInitDialog函数。因此你只需确定OnInitDialog函数哪一句出错了(这里的OnInitDialog函数是指派生对话框类的OnInitDialog函数)。
0 0
- CDilog::DoModal调用失败,原因分析
- DoModal()函数调用失败的原因分析:
- 关于对话框DoModal()函数调用失败的原因分析
- 关于对话框DoModal()函数调用失败的原因分析
- 关于对话框DoModal()函数调用失败的原因分析(Debug Assertion Failed)
- DoModal失败原因
- dll调用失败的原因分析
- 系统调用system失败的原因分析
- LoadLibrary调用失败原因
- LoadLibrary调用失败原因
- 项目失败原因分析
- 占座网失败原因分析
- 装机失败原因分析
- 软件新产品开发失败原因分析
- 软件新产品开发失败原因分析
- Wince启动失败原因分析
- HIS项目失败原因分析
- tomcat启动失败原因分析
- 【整理】adb命令、adb shell与Linux命令
- android studio 启动问题
- 1051. Pop Sequence (25)
- 嵌入式 详解udev
- Pie poj 二分求最大平均值
- CDilog::DoModal调用失败,原因分析
- 【NOI2007】【BZOJ1492】货币兑换Cash
- 使用cout来进行格式化输出
- 198House Robber
- 网络爬虫初步(一)
- UINavigationController实例之私人通讯录
- 有关Servlet初始化参数的获取方法
- 嵌入式 使用udev高效、动态地管理Linux 设备文件
- HDU 1686 Oulipo