vs2008转到2013后,在对话框中添加控件程序直接退出
2015-06-11 15:34
267 查看
用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
要严格地注意各种资源的释放问题。
程序“[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
要严格地注意各种资源的释放问题。
相关文章推荐
- SecureCRT 6.7.1 RI和谐 皴 补丁 方法
- jQuery lazyload插件详解和问题解答
- 3DMax的OFusion插件的使用问题
- GMAT写作模板:观点相互比较型
- java多线程线程通信
- 安卓开发app之 不能跳过的初始强制界面
- 职业选择--再温《HP大中华区总裁孙振耀退休感言》(终)
- SQL中inner join、outer join和cross join的区别
- 转一个文章:在腾讯的第一堂产品课
- python笔记--磁盘使用率
- Android Service完全解析,关于服务你所需知道的一切
- linux 网络编程之最简单的tcp通信客户端
- UniCode 下 CString 转 char* 的方法
- 链队
- 2015 程序设计实习之深搜+广搜作业
- 你会做选择题么?--再温《HP大中华区总裁孙振耀退休感言》(续)
- vs2008转为2013之后,在对话框上添加控件程序直接退出
- iOS 打开iPhone照相机和相册
- 基于jQuery鼠标悬停上下滑动导航条
- Linux-Linux磁盘空间被未知资源耗尽