vs2008转为2013之后,在对话框上添加控件程序直接退出
来源:互联网 发布:土耳其语 知乎 编辑:程序博客网 时间:2024/05/23 17:12
用vs2008写了一个对话框软件,上面有一些资源,后来升级到2013了,直接运行是可以正常显示的,但是在升级之后2013的对话框上添加任意的资源,再次运行代码,编译都是没有错误的,运行的时候却直接退出了,提示:
程序“[0x4FC] XX.exe”已退出,返回值为 0(0x0)。
各种调试,最后才在同事的帮助下,发现原来是一个很小的问题,算是vs2013的bug吧,我原来的对话框界面上包含了一个PICTURE控件,type选的是bitmap,本来在rc文件中的格式为:
CONTROL "",IDC_PIC_ROUTE,"Static",SS_BITMAP | SS_CENTERIMAGE,15,17,613,374,WS_EX_CLIENTEDGE
当2013中新添加任意资源以后,这个描述被更改了,为:
CONTROL "",IDC_PIC_ROUTE,15,17,613,374, SS_CENTERIMAGE | NOT WS_GROUP,WS_EX_CLIENTEDGE
后来,自己添加了一个static之后,一切又都OK了
CONTROL "",IDC_PIC_ROUTE,"Static",15,17,613,374, SS_CENTERIMAGE | NOT WS_GROUP,WS_EX_CLIENTEDGE
(⊙﹏⊙)b
结果很简单,不过过程中也发现了一些自己的问题,首先是发现有许多
“XX.exe”(Win32): 已加载“C:\Windows\System32\ole32.dll”。无法查找或打开 PDB 文件。
类似的提示,后来查找之后解决方法为:
在菜单的“调试”-“选项和设置”的“调试”-“常规”中勾选“启用源服务器支持”
在“调试”-“符号”中勾选“Microsoft”符号服务器。
于是有很多无法查找或打开PDB文件的现象就不见了,不过还是会有个人无法查找或打开,查了查应该不是这个的问题,因为vs2008中也有提示PDB无法打开的,但是可以正常运行,而且网上查资料看到有人说有些dll是不提供PDB文件的
http://www.cnblogs.com/itech/archive/2011/08/15/2136522.html
发现的第二个问题是输出窗口中有:
f:\dd\vctools\vc7libs\ship\atlmfc\include\afxwin2.inl
Line: 100
这个文件在这个路径下是不存在,是windows自动生成的文件貌似,可以在vs的安装路径下找到这个文件,打开,找到相应的行,发现是
AFXWIN_INLINE CDC* CWnd::GetDC()
{ ASSERT(::IsWindow(m_hWnd)); return CDC::FromHandle(::GetDC(m_hWnd)); }
直接退出,打断点调试发现有一个GetDC是空的,修改之后该错误不再提示了
之前有发现一个提示
File: f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wingdi.cpp
找到相应的行
BOOL CDC::Attach(HDC hDC)
{
ASSERT(m_hDC == NULL); // only attach once, detach on destroy
ASSERT(m_hAttribDC == NULL); // only attach to an empty DC
/*这一行出错,(m_hAttribDC 不是NULL,直接退出了,调用了两次OnCreate,里面CreateCompatibleDC调用了两次,修改为
if (m_dcMemAll->m_hDC)
{
if (NULL != m_dcMemAll)
m_dcMemAll->DeleteDC();
}
m_dcMemAll->CreateCompatibleDC(&dc);
该错误不再提示了
之后代码不提示任何错误,但是直接退出了
第三个问题是:
VS2013的OnCreate和OnSize都调用了两次
OnCreate-OnSize-OnMove-OnCreate-OnSize-OnMove-退出
而调试正常的对话框,创建过程调用的顺序是:
OnCreate-OnSize-OnMove-OnInitDialog-OnMove-OnPaint-OnCtlColor
调试发现CreateDialogIndirect返回NULL,而正常的对话框则返回一个有效值,但是GetLastError返回的都是0,即没有错误
再后来看到论坛上有类似问题的几篇文章:
http://bbs.csdn.net/topics/90078517
http://bbs.csdn.net/topics/350017959
http://bbs.csdn.net/topics/330115970
http://bbs.csdn.net/topics/330113863
感觉可能是自己的资源没有释放
于是又各种检查资源,屏蔽句柄初始化,还是不行
最后,发现是资源文件被更改的问题,over
要严格地注意各种资源的释放问题。
- vs2008转为2013之后,在对话框上添加控件程序直接退出
- vs2008转到2013后,在对话框中添加控件程序直接退出
- 在退出按钮上添加弹出选择对话框
- VS2008 MFC对话框工程中,在对话框中添加ActiveX控件生成类的问题
- 在对话框上添加视图
- 在对话框上添加状态栏
- 用vs2008开发基于wince的程序如何直接运行在wince上
- vc在对话框中强制退出程序
- 在VS2008上创建一个安装程序
- 对话框式退出程序
- VC 直接在界面上添加文字
- 在对话框上添加软键盘
- VC在对话框窗口上添加状态栏
- 获取控件在对话框上的坐标
- 在程序运行时用鼠标调整对话框上的控件
- 在程序运行时用鼠标调整对话框上的控件
- vs2008 MFC 对话框 敲回车,ESE键,程序自动退出解决办法
- wxWidgets在程序中添加进度条对话框。
- android MediaRecorder录音
- nyoj-19-擅长排列的小明
- iOS 的 XMPPFramework 简介
- 减肥食谱之——我的带饭策略: www.haidi88.com
- 使用 GNU Libtool 创建库
- vs2008转为2013之后,在对话框上添加控件程序直接退出
- 2012年新增SAT数学知识点介绍
- 小知识点BeanUtils.copyProperties
- WIN7下,用Eclipse/NDK/CDT编译Cocos2dx的工程
- BaseAnimation是基于开源的APP,致力于收集各种动画效果(最新版本1.3)
- AWS 下 Ubuntu 安装最新XAMPP 实操
- Java多线程
- android 带箭头的textview文字伸缩效果
- 路由子系统——基本概念与高级路由