VC6 到 VS2013 MFC 运行时错误
Posted
技术标签:
【中文标题】VC6 到 VS2013 MFC 运行时错误【英文标题】:VC6 to VS2013 MFC Runtime Error 【发布时间】:2015-07-24 20:53:13 【问题描述】:我正在尝试使用工具集 12_xp 将旧产品从 VC6 升级到 VS2013。我可以让项目编译得很好,但是我得到了一个运行时断言,它似乎与 CSingleLock lock() 调用有关。
CSingleLock slock(&CV7CmnSS::m_cs); // Wait for access
slock.Lock(m_dwTimeout); // <- this is the line that does it.
CV7CmnSS::m_cs
在此项目引用的另一个 dll 中的不同类中声明为静态对象。
exe的头文件有这个CCriticalSection CV7CmnSS::m_cs;
在 CV7CmnSS 头文件中声明static CCriticalSection m_cs;
我尝试单步执行 MFC 代码(我知道,我知道...) 这是我能得到的所有进一步......
mfc120d.dll!CCriticalSection::Lock(unsigned long dwTimeout) Line 118 C++ //
_AFXMT_INLINE BOOL (::CCriticalSection::Lock(DWORD dwTimeout))
ASSERT(dwTimeout == INFINITE);
(void)dwTimeout;
return Lock();
我得到的断言 I 框:
相当通用..
两个 dll 项目都针对相同的工具集 12_xp,都使用 MBCS,都使用 MFC 作为共享 dll。两者都使用多线程调试 dll 设置。
我怀疑是跨线程问题?但我不确定如何进行。
如果我可以提供更多信息,请告诉我。
编辑:
我忘了添加这个小宝石,如果我在没有调试的情况下在发布版本中运行程序,我可以进一步使用该应用程序,但是会弹出这个奇怪的消息......
【问题讨论】:
【参考方案1】:您显示的代码揭示了问题:有一个断言要求 dwTimeout 参数为 INFINITE。正如您从代码中看到的那样,正如CCriticalSection::Lock 文档中提到的那样,该参数被忽略,因此您可以更改代码以将 INFINITE 作为参数传递,或者只调用不带参数的重载(这样做同样的事情)。
至于为什么在release模式下不会发生错误,是因为asserts只在debug模式下编译,所以assert永远不会发生。导致该消息框的原因与断言完全无关。
【讨论】:
哦,哇,它一直在我面前,这有点尴尬...:) 谢谢。以上是关于VC6 到 VS2013 MFC 运行时错误的主要内容,如果未能解决你的问题,请参考以下文章
用vs2008做的MFC程序,怎么在WINDOWS XP下运行?