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 运行时错误的主要内容,如果未能解决你的问题,请参考以下文章

创建MFC时出现这个错误,怎么解决?

使用 mfc 的 EXE(调试)无法在其他 PC 上运行

用vs2008做的MFC程序,怎么在WINDOWS XP下运行?

VS2012编译的MFC程序XP运行出错R6010

如何用vc6.0 来做图像处理?是用mfc工程吗,然后导入图像么? 如何去掉图像的背景,然后反转

VS2013生成XP独立运行程序