【发布时间】:2010-09-13 10:41:30
【问题描述】:
我在主线程中有 CWnd,在单独的线程中创建了一个带有 WebBrower 控件的 CWnd。 这是必要的,因为 WebBrowser 导航到运行 javascripts 的 url,这将阻止 WebBrowser。所以我在一个单独的线程中使用 WebBrowser 控件来防止 GUI Thread vom 挂起。我也在我的应用程序的主线程中完成了这个:
CCustomOccManager *pMgr = new CCustomOccManager();
AfxEnableControlContainer(pMgr);
这是为了将 WebBrowser 控件扩展到我的“window.external”界面。
单独的线程机制在 Windows 7 和 Vista 中运行良好。但在 Windows XP 中,我得到了 MFC 断言。
这是我的代码:
m_WndMain.CreateEx(WS_EX_TOPMOST | WS_EX_TOOLWINDOW, m_mainWndClass, NULL, WS_POPUP, m_pArgs->m_WindowRect, NULL, 0);
m_WndMain.ShowWindow(SW_SHOW);
m_WndMain.UpdateWindow();
CRect clientRect;
m_WndMain.GetClientRect(&clientRect);
/* !!! CreateControl FAILS IN WINDOWS XP (=ASSERT)!!! */
m_CtrlBrowser.CreateControl(CLSID_WebBrowser, NULL, WS_VISIBLE | WS_CHILD, clientRect, &m_WndMain, AFX_IDW_PANE_FIRST);
.....
MFC 断言(第 925 行内部调用第 305 行):
wincore.cpp, LINE 925
-----------------------------------
CHandleMap* pMap = afxMapHWND();
ASSERT(pMap != NULL); <--- pMap is NULL, ASSERT is raised
wincore.cpp, LINE 305
-----------------------------------
AFX_MODULE_THREAD_STATE* pState = AfxGetModuleThreadState();
...some code
pState->m_pmapHWND; <--- m_pmapHWND is NULL!
所以“m_pmapHWND”在 Windows XP 中为 NULL。但在 Vista 和 7 中它不是 NULL。
在 Windows XP 下,如果我在主线程中创建 WebBrowser 控件,它就可以工作。
那么问题是什么?不同的 MFC 版本或 Windows XP 问题?
【问题讨论】:
标签: c++ mfc webbrowser-control