gpt4 book ai didi

c++ - WebBrowser Control (MFC) 在单独的线程中创建,在 Windows 7 和 Vista 中运行,但在 Windows XP 中运行

转载 作者:搜寻专家 更新时间:2023-10-31 01:58:47 25 4
gpt4 key购买 nike

我在主线程中有 CWnd,在单独的线程中创建了带有 WebBrower 控件的 CWnd。这是必要的,因为 WebBrowser 导航到运行 javascript 的 url,这将阻止 WebBrowser。所以我在一个单独的线程中使用 WebBrowser 控件来防止 GUI 线程 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 Assert(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 问题?

最佳答案

我调试了 MFC,发现 COM 必须在新创建的线程中初始化。

所以在线程启动例程中我正在做一个

CoInitializeEx(NULL,  COINIT_APARTMENTTHREADED);

一开始一切正常。

有趣的是,这在 Windows 7 和 Vista 下不需要,只有 XP。

关于c++ - WebBrowser Control (MFC) 在单独的线程中创建,在 Windows 7 和 Vista 中运行,但在 Windows XP 中运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3699633/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com