AddToRecentFileList引起__debugbreak

Windows 2014年09月05日 ,

由于目前所做产品的外部竞争很少,所以产品的开发速度一直很慢,最开始使用VC6.0进行开发,中间变更过开发工具,使用VS2005,现在变更到VS2010。产品从2000年开始开发,虽然产品已经在使用当中了,后期的再次的开发及维护是不可少的。当年从VC6.0到VS2005也是有过很问题,现在使用VS2010问题还是不少,还有一些问题可能还没有发现。

发现问题

由于在原来的数据结构进行了扩充,现在保存文件后提示如下,

AddToRecentFileList

AddToRecentFileList

程序停留在

 __debugbreak();

随后逐步调试发现问题出在如下语句,

AfxGetApp()->AddToRecentFileList((LPCTSTR)m_strFileName); 

对传入的字符串进行了测试没有问题,那是什么问题呢?

那肯定就是AddToRecentFileList的用法出了问题,查找MSDN发现这个函数在VS2010版进行了重载。

找到原文件

Microsoft Visual Studio 10.0\VC\atlmfc\src\mfc\appui.cpp

中查找该函数,发现定义如下。

void CWinApp::AddToRecentFileList(LPCTSTR lpszPathName)
{
	ASSERT_VALID(this);
	ENSURE_ARG(lpszPathName != NULL);
	ASSERT(AfxIsValidString(lpszPathName));

	if (m_pRecentFileList != NULL)
	{
#if (WINVER >= 0x0601)
		m_pRecentFileList->Add(lpszPathName, m_pszAppID);
#else
		m_pRecentFileList->Add(lpszPathName);
#endif
	}
}

由于

WINVER >= 0x0601

成立,由于代码是老古董,希望执行的是

m_pRecentFileList->Add(lpszPathName);

解决办法

找到问题的原因,解决起来就不会太难了,把最近文件列表这一块重写的工作量太大了,可以在自己的App类中对AddToRecentFileList进行覆盖。如下:

void CMyApp::AddToRecentFileList(LPCTSTR lpszPathName)
{
    m_pRecentFileList->Add(lpszPathName);
}

简单粗暴就把这个问题解决了。

总结

当发生错误的时候,对自己之前所掌握的一切开始怀疑,才能真正的逐个排查错误。

吐槽下微软,我把我的青春都花费在查找MFC的API上了,真能增加就业啊。

最后吐槽一下百度,正事一个也查不到,只能用来查查病了,恶心就是怀孕了,肚子疼就是来事了……

如无特别说明,本站文章皆为原创,若要转载,务必请注明以下原文信息:
日志标题:《AddToRecentFileList引起__debugbreak》
日志链接:http://furzoom.com/addtorecentfilelist-debugbreak/
博客名称:枫竹梦

发表评论

插入图片

NOTICE1:请申请gravatar头像,没有头像的评论可能不会被回复!

回到顶部