您的位置:首页 > 其它

vs2008转为2013之后,在对话框上添加控件程序直接退出

2015-06-11 15:32 936 查看
用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

要严格地注意各种资源的释放问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: