[转载备份]WebBrowser 跨线程操作中的一些问题

WebBrowser 必须是单线程的, 如果我在另一个线程调用invoke, 那么这个invoke将返回错误.妥协的办法是通过发送消息(SendMessage)来变相实现跨线程控制.  

         但是其中有一个问题,必须要解决, 因为跨线程,所以计数问题必须要考虑. 对于invoke对象的 IDispatch 指针,必须增加计数,同时,对于DISPPARAMS中的 IDispatch 对象同样要增加计数.   否则有可能在SendMessage时,对象已然被WebBrowser销毁( JScript.dll 控制js ), 使程序崩溃.

v

 

在多线程中使用m_web.Navigate("",NULL,NULL,NULL,NULL);       //CWebBrowser2 m_web;  时出错,不用多线程没有问题.

解决方法:

IWebBrowser2 *m_pBrowser;

IUnknown *pUnknown= m_web.GetControlUnknown();
 pUnknown->QueryInterface(&m_pBrowser);

在线程中使用

m_pBrowser->Navigate(L"",NULL,NULL,NULL,NULL);    //L是必须的

如果使用字符串变量

m_pBrowser->Navigate(webaddr.AllocSysString(),NULL,NULL,NULL,NULL);

否则无法编译通过

另外在ie6下没问题,ie7会弹出"无法找到 ,请确保路径或Internet地址正确"

在网上搜到以下解决方法(没测试):发个自己定义消息给自己的窗口,收到这个消息后再去调用Navigate

posted @ 2013-01-19 16:24  Y4ng  阅读(869)  评论(0编辑  收藏  举报