2010-09-13 3 views
2

У меня есть CWnd в основном потоке и CWnd с элементом управления WebBrower, созданным в отдельном потоке. Это необходимо, потому что WebBrowser перемещается по URL-адресам, у которых есть javascripts, которые будут блокировать WebBrowser. Таким образом, я с помощью элемента управления WebBrowser в отдельном потоке препятствует зависанию виджета GUI. Кроме того, я сделал это в основном потоке в моем приложении:WebBrowser Control (MFC), созданный в отдельном потоке, работающем в Windows 7 и Vista, но Windows XP

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" является NULL в Windows XP. Но это не NULL в Vista и 7.

В Windows XP, если я создаю элемент управления WebBrowser в основном потоке, он работает.

Так в чем проблема? Различные версии MFC или проблема с Windows XP?

Пожалуйста, помогите, это срочно. Большое спасибо!

Chris

ответ

3

Я отлажена МФЦ и выяснили, что COM должен быть инициализирован во вновь созданном потоке.

Таким образом, в резьбе startroutine Я делаю

CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); 

на первом и все работает.

Интересно, что в Windows 7 и Vista это не требуется, только XP.

Смежные вопросы