EDN Admin
Well-known member
<p align=left>We have a very large application thats been working fine and I just tried to upconvert to the new CMFCxxxx classes. It seemed to work flawlessly until I tried linking in release mode and that fails miserably.
<p align=left>
<p align=left>The link works but the code crashes.
<p align=left>
<p align=left>As a simple test I tried using the scribble walkthrough in MSDN. After making the changes it ran fine in debug and release but sure enough when I swtiched to static link MFC it crashes in very much the same fashion.
<p align=left>
<p align=left>Heres what crashes at a user level:
<p align=left> <font size=2>
<p align=left>
<div class=codeseg>
<div class=codecontent>
<div class=codesniptitle><span style="width:100% Code Snippet <font size=2>
<p align=left>CMainFrame* pMainFrame = </font><font color="#0000ff" size=2>new</font><font size=2> CMainFrame;
<p align=left></font><font color="#0000ff" size=2>if</font><font size=2> (!pMainFrame->LoadFrame(IDR_MAINFRAME))
<p align=left>{
<p align=left></font><font color="#0000ff" size=2>delete</font><font size=2> pMainFrame;
<p align=left></font><font color="#0000ff" size=2>return</font><font size=2> FALSE;
<p align=left>} </font>
<p align=left>
<p align=left> </font>
<font size=2>
<p align=left>
Here the LoadFrame crashes hard. If you trace through the code for a while... you get to
<p align=left>
<p align=left>in afxmdiclientareawnd.cpp line 618
<p align=left> <font size=2>
<p align=left>
<div class=codeseg>
<div class=codecontent>
<div class=codesniptitle><span style="width:100% Code Snippet <font size=2>
<p align=left>CWnd::CalcWindowRect(lpClientRect, nAdjustType);
<p align=left></font><font color="#0000ff" size=2>int</font><font size=2> nActiveTab = m_wndTab.GetActiveTab();
<p align=left></font><font color="#0000ff" size=2>for</font><font size=2> (</font><font color="#0000ff" size=2>int</font><font size=2> i = 0; i < m_wndTab.GetTabsNum(); i++)
<p align=left>{
<p align=left>CWnd* pWnd = m_wndTab.GetTabWnd(i);
<p align=left></font><font color="#0000ff" size=2>if</font><font size=2> (pWnd->GetSafeHwnd() == 0)
<p align=left>{
<p align=left></font><font color="#0000ff" size=2>continue</font><font size=2>;
<p align=left>} </font>
<p align=left>
<p align=left>
</font><font size=2>
<p align=left>
Single stepping through this carefully you find that GetActiveTab is calling a garbage function as is GetTabsNum. The virtual table is pointing who-knows-where and calling random code that may or may not totally crash. In our app the second call is going to a string value instead of code.
<p align=left>
<p align=left>Does anyone know how to get a static link working with the new MFC stuff? Unless Im missing something it is just totally broken. I really hope Im missing something.
<p align=left>
<p align=left>Thanks,
<p align=left> Mark
<p align=left></font></font>
View the full article
<p align=left>
<p align=left>The link works but the code crashes.
<p align=left>
<p align=left>As a simple test I tried using the scribble walkthrough in MSDN. After making the changes it ran fine in debug and release but sure enough when I swtiched to static link MFC it crashes in very much the same fashion.
<p align=left>
<p align=left>Heres what crashes at a user level:
<p align=left> <font size=2>
<p align=left>
<div class=codeseg>
<div class=codecontent>
<div class=codesniptitle><span style="width:100% Code Snippet <font size=2>
<p align=left>CMainFrame* pMainFrame = </font><font color="#0000ff" size=2>new</font><font size=2> CMainFrame;
<p align=left></font><font color="#0000ff" size=2>if</font><font size=2> (!pMainFrame->LoadFrame(IDR_MAINFRAME))
<p align=left>{
<p align=left></font><font color="#0000ff" size=2>delete</font><font size=2> pMainFrame;
<p align=left></font><font color="#0000ff" size=2>return</font><font size=2> FALSE;
<p align=left>} </font>
<p align=left>
<p align=left> </font>
<font size=2>
<p align=left>
Here the LoadFrame crashes hard. If you trace through the code for a while... you get to
<p align=left>
<p align=left>in afxmdiclientareawnd.cpp line 618
<p align=left> <font size=2>
<p align=left>
<div class=codeseg>
<div class=codecontent>
<div class=codesniptitle><span style="width:100% Code Snippet <font size=2>
<p align=left>CWnd::CalcWindowRect(lpClientRect, nAdjustType);
<p align=left></font><font color="#0000ff" size=2>int</font><font size=2> nActiveTab = m_wndTab.GetActiveTab();
<p align=left></font><font color="#0000ff" size=2>for</font><font size=2> (</font><font color="#0000ff" size=2>int</font><font size=2> i = 0; i < m_wndTab.GetTabsNum(); i++)
<p align=left>{
<p align=left>CWnd* pWnd = m_wndTab.GetTabWnd(i);
<p align=left></font><font color="#0000ff" size=2>if</font><font size=2> (pWnd->GetSafeHwnd() == 0)
<p align=left>{
<p align=left></font><font color="#0000ff" size=2>continue</font><font size=2>;
<p align=left>} </font>
<p align=left>
<p align=left>
</font><font size=2>
<p align=left>
Single stepping through this carefully you find that GetActiveTab is calling a garbage function as is GetTabsNum. The virtual table is pointing who-knows-where and calling random code that may or may not totally crash. In our app the second call is going to a string value instead of code.
<p align=left>
<p align=left>Does anyone know how to get a static link working with the new MFC stuff? Unless Im missing something it is just totally broken. I really hope Im missing something.
<p align=left>
<p align=left>Thanks,
<p align=left> Mark
<p align=left></font></font>
View the full article