[转载备份]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