【问题标题】:MFC Assertion error when calling function from DLL从 DLL 调用函数时 MFC 断言错误
【发布时间】:2015-09-17 16:57:59
【问题描述】:

我从 DLL 上下文中调用这个函数,

void CmodguiApp::ReportStatusBarImageCount() {

CMainFrame *frm = nullptr;
auto app = AfxGetApp();
if (nullptr != app) {
     frm = (CMainFrame*)app->GetMainWnd();
}

assert(frm);

frm->setStatusBarImageCount(L"Text");

}

一切正常。 frm 不是空指针。

然后,在setStatusBarImageCount内部,如下所述,软件导致断言错误

可能出了什么问题?

void CMainFrame::setStatusBarImageCount(const wchar_t *str) {

     m_wndStatusBar.SetPaneText(m_wndStatusBar.CommandToIndex(ID_STATUSBAR_IMAGECOUNT), str);

}

此应用具有 MFC 动态链接。请让我强调,setStatusBarImageCount 函数是从 DLL 中调用的,而不是从主 MFC 应用程序中调用的。

【问题讨论】:

  • 发生的断言错误究竟是什么?
  • CommandToIndex 可能返回 -1。当您获得调试断言时,单击“重试”,然后在下一个窗口中单击“中断”,它将带您找到问题的根源。
  • @PaulMcKenzie 它不会让我深入研究 MFC 代码(只告诉我它在 mfc120 dll 上)
  • 是的,有时它不会让您深入了解。但至少它会告诉您文件名(但不是正确的文件路径)。在您的计算机上查找此文件:“C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\atlmfc\src\mfc\wincore.cpp”(我使用的是 VS 2015,如果您使用的是不同的版本)。然后查看“wincore.cpp”的第 972 行。
  • 这可能是您之前回答的多线程错误。尽管我不确定呼叫的来源有什么不同。顺便说一句,调试器应该将您直接带到 MFC 错误源。检查解决方案的属性页中是否有“调试源文件”。见图片:ericmartel.com/wp-content/uploads/2010/04/donotlook.jpg 但有时调试器就是不想合作。

标签: c++ dll mfc


【解决方案1】:

这是因为我从自定义线程 (https://msdn.microsoft.com/en-us/library/975t8ks0.aspx) 调用 MFC API

这应使用线程安全的自定义消息实现来完成 (https://msdn.microsoft.com/en-us/library/k35k2bfs.aspx)

【讨论】:

    猜你喜欢
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多