从 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函数出现报错
从 C# 调用时,是不是可以获得 Kernel32.dll 函数的最后一个错误代码?
断言失败:在 .js 文件 (emscripten) 中调用 c 函数时,在运行时初始化错误之前调用了本机函数 `int_sqrt`