从 DLL 调用函数时 MFC 断言错误

Posted

技术标签:

【中文标题】从 DLL 调用函数时 MFC 断言错误【英文标题】:MFC Assertion error when calling function from DLL 【发布时间】: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 但有时调试器就是不想合作。 【参考方案1】:

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

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

【讨论】:

以上是关于从 DLL 调用函数时 MFC 断言错误的主要内容,如果未能解决你的问题,请参考以下文章

halcon在VC++中,并生成dll文件,供MFC的EXE程序调用,dll中使用halcon函数出现报错

mfc140ud.dll 中的调试断言失败

从 C# 调用时,是不是可以获得 Kernel32.dll 函数的最后一个错误代码?

MFC生成的DLL导出类的函数,在Qt中如何调用

断言失败:在 .js 文件 (emscripten) 中调用 c 函数时,在运行时初始化错误之前调用了本机函数 `int_sqrt`

Memory AccessViolationException 错误从 C# 调用 DLL