Re: [MFC - SMARTDEVICES] : Switching views and CommandBar
Joseph M. Newcomer a ?crit :
What does wincore.cpp line 442 contain? Does it suggest what is wrong?
Since I don't have WinCe or embedded VS installed, my wincore.cpp line 442 doesn't contain
an assert.
joe
On Wed, 23 May 2007 20:52:54 +0200, Mosfet <anonymous@free.fr> wrote:
Hi,
Normally I shoult not post here because my problem is specific to wince
platforms but I am a bit in a hurry and this newsgroup has more readers.
I am trying for two days to write an application able to switch bewteens
views and to display a new command bar(this part is wince specific).
As long as I try only to switch bewteen view, everything works fine but
when I try to modify the Command bar I get an assert in wincore.cpp L
442. I have already posted to MSDN forums but with no success.
So maybe a MFC guru with a pocket pc experience could have a look ...
To reproduce my issue I have done a sample app available here :
http://www.smartdev.fr/Downloads/SwitchView.zip
To test it you need WM5 or WM6 SDK installed.
The problem is in MainFrame a CCommandBar is created but if I try to
delete it to recreate a new one I get the assert.
Any help would be appreciated.
Joseph M. Newcomer [MVP]
email: newcomer@flounder.com
Web: http://www.flounder.com
MVP Tips: http://www.flounder.com/mvp_tips.htm
Visual studio 2005 with windows mobile 5 SDK
(http://www.microsoft.com/downloads/details.aspx?familyid=83A52AF2-F524-4EC5-9155-717CBE5D25ED&displaylang=en)
is enough to compile my sample.
Anyway here the function where there is the assert:
LRESULT CALLBACK
AfxWndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
{
// special message which identifies the window as using AfxWndProc
if (nMsg == WM_QUERYAFXWNDPROC)
return 1;
// all other messages route through message map
CWnd* pWnd = CWnd::FromHandlePermanent(hWnd);
ASSERT(pWnd != NULL && pWnd->m_hWnd == hWnd); <====== L442
if (pWnd == NULL || pWnd->m_hWnd != hWnd)
return ::DefWindowProc(hWnd, nMsg, wParam, lParam);
#ifndef _WIN32_WCE
return AfxCallWndProc(pWnd, hWnd, nMsg, wParam, lParam);
#else
// Post-process WM_DESTROY so we can fake a WM_NCDESTROY.
// Also route any additional message to an empty window procedure.
LRESULT lResult = AfxCallWndProc(pWnd, hWnd, nMsg, wParam, lParam);
if (nMsg == WM_DESTROY)
{
pWnd->SendMessage(WM_NCDESTROY);
::SetWindowLong(hWnd, GWL_WNDPROC, (LONG)AfxNullWndProc);
}
return lResult;
#endif // !_WIN32_WCE
}
when I look at the assert : pWnd is NULL.
the problem comes from CCommandBar destructor and more precisely(at
least I suppose) from the DestroyWindow()
CCommandBar::~CCommandBar()
{
if (m_hWnd != NULL)
{
CFrameWnd* pFrameWnd = GetParentFrame();
if (pFrameWnd != NULL && pFrameWnd->m_hCommandBar == m_hCommandBar)
{
pFrameWnd->m_hCommandBar = NULL;
}
HWND hWnd = m_hWnd;
Detach();
::DestroyWindow(hWnd); <======= I get an assert when i pass this step
}
if (m_pMenu != NULL)
{
if (m_pMenu->m_hMenu != NULL)
{
m_pMenu->DestroyMenu();
}
delete m_pMenu;
}
}
You can look at Microsoft Visual Studio
8\VC\ce\atlmfc\src\mfc\barcmd.cpp for more information.