VC6 到 VS2013 MFC 运行时错误

VC6 to VS2013 MFC Runtime Error

我正在尝试使用工具集 12_xp 将遗留产品从 VC6 升级到 VS2013。我可以让项目编译得很好,但是我得到一个 运行time ASSERT,它似乎与 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 中的不同 class 中声明为静态对象。

exe的头文件有这个CCriticalSection CV7CmnSS::m_cs;

在 CV7CmnSS 头文件中声明static CCriticalSection m_cs;

我尝试单步执行 MFC 代码(我知道,我知道...) 这就是我能得到的所有进一步...

mfc120d.dll!CCriticalSection::Lock(unsigned long dwTimeout) 第 118 行 C++ //<-- 来自调用堆栈 window

_AFXMT_INLINE BOOL (::CCriticalSection::Lock(DWORD dwTimeout))
{ 
    ASSERT(dwTimeout == INFINITE); 
    (void)dwTimeout; 

    return Lock(); 
}

我得到的 assert I 框:

相当通用..

两个 dll 项目都针对相同的工具集,12_xp,都使用 MBCS,都使用 MFC 作为共享 dll。两者都使用多线程调试 dll 设置。

我怀疑是跨线程问题?但我不确定如何进行。

如果有更多信息可以提供,请告诉我。

编辑:

我忘了添加这个小 gem,如果我 运行 发布的程序没有调试,我可以进一步使用应用程序,但是会弹出这个奇怪的消息.. ..

您显示的代码揭示了问题:有一个断言要求 dwTimeout 参数为 INFINITE。正如您从代码中看到的,以及 CCriticalSection::Lock 文档中提到的,该参数被忽略,因此您可以只更改代码以将 INFINITE 作为参数传递,或者只调用不带参数的重载(做同样的事情)。

至于为什么在release模式下不会报错,是因为asserts只是在debug模式下编译的,所以assert不会报错。导致该消息框的原因与断言完全无关。