2010-09-13 7 views
2

J'ai CWnd dans le thread principal et un CWnd avec un contrôle WebBrower créé dans un thread séparé. Ceci est nécessaire, car WebBrowser navigue vers les URL sur lesquelles des scripts javascripts sont en cours d'exécution et qui bloquent le navigateur Web. Donc, avec le contrôle WebBrowser dans un thread séparé, j'empêche le thread de l'interface graphique de se bloquer. Aussi je l'ai fait dans le fil conducteur dans ma demande:Contrôle WebBrowser (MFC) créé dans thread distincte fonctionnant dans Windows 7 et Vista, mais Windows XP

CCustomOccManager *pMgr = new CCustomOccManager(); 

AfxEnableControlContainer(pMgr); 

C'est pour étendre le contrôle WebBrowser à mon sur l'interface « window.external ».

Le mécanisme de fil séparé fonctionne correctement sous Windows 7 et Vista. Mais dans Windows XP, je reçois MFC affirme.

C'est mon code:

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 (ligne 925 appels en interne ligne 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! 

Alors "m_pmapHWND" est NULL dans Windows XP. Mais ce n'est pas NULL dans Vista et 7.

Sous Windows XP, si je crée le contrôle WebBrowser dans le thread principal, cela fonctionne.

Alors, quel est le problème? Différentes versions de MFC ou un problème de Windows XP?

S'il vous plaît, aidez, c'est urgent. Merci beaucoup!

Chris

Répondre

3

Je déboguée le MFC et découvert que le COM doit être initialisé dans le thread nouvellement créé.

Ainsi, dans le fil startroutine je fais un

CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); 

au début et tout fonctionne.

Intéressant que ce n'est pas nécessaire sous Windows 7 et Vista, seulement XP.

Questions connexes