公司下了一个新的要求
就是要在Web中加入一个OCX组件,来随时控制和相应服务端的消息,
开始认为很简单
认为用ActiveX事件就可以了
但是发现有个问题 我的Socket用一个新的线程了控制的
在线程里直接产生事件FireOnCallIn 网页不响应.
后来想到一个方法 就是在线程里Post一个Message给控件,在让控件产生FireOnCallIn
测试了一个 ,很好用,
过了一会又测试了一下,发现又不能触发方法了,代码没有改动啊,为什么不能触发了呢?想想
整个过程,第一次测试的时候,我用鼠标点击过一个我写的那个ActiveX,第二次没有点击.
原来差别就在这里啊
但是在应用过程中不能每次都这样吧.
代码全部修改 用ActiveX直接回调JavaScript的方法.
结果还是线程的问题线程
网上搜索吧!!
http://topic.csdn.net/u/20070212/20/1011ad32-1ce7-416d-9e6c-cffca7a100fe.html?seed=1066340289
根据上面的贴子终于 解决了...
面为我的程序中的关键代码
声明一个全局的
IStream* pStream;
初始化OCX
IOleClientSite* m_spClientSite = GetClientSite(); IServiceProvider* isp; IWebBrowser2* ppBrowser; HRESULT hr = m_spClientSite->QueryInterface(IID_IServiceProvider, reinterpret_cast<void **>(&isp)); if(FAILED(hr)) return FALSE; hr = isp->QueryService(IID_IWebBrowserApp, IID_IWebBrowser2, reinterpret_cast<void **>(&ppBrowser)); ::CoMarshalInterThreadInterfaceInStream(IID_IWebBrowser2, ppBrowser, &pStream);
在线程的初始化段
::CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); IWebBrowser2 * ppBrower; ::CoGetInterfaceAndReleaseStream(pStream, IID_IWebBrowser2, (void**)&ppBrower);
这样我们就可以用ppBrower,而不会发生找不到的问题了
调用JavaScript
void CMediaTerminalOcxCtrl::DoFunction(IWebBrowser2 * ppBrowser,char * strCmd,int nParamCount,...) { HRESULT hr=NULL; if(NULL==ppBrowser) return; IDispatch *m_ppDispDoc; hr = ppBrowser->get_Document(&m_ppDispDoc); if(FAILED(hr)) return; IHTMLDocument2 *ppDocument2; hr = m_ppDispDoc->QueryInterface(IID_IHTMLDocument2 ,reinterpret_cast<void **>(&ppDocument2)); if(FAILED(hr)) return; IDispatch *pScript; hr=ppDocument2->get_Script(&pScript); if(FAILED(hr)) return; // CComBSTR bstrMember(strCmd); DISPID dispid; hr=pScript->GetIDsOfNames(IID_NULL,&bstrMember,1,LOCALE_SYSTEM_DEFAULT,&dispid); if(FAILED(hr)) return; // DISPPARAMS dispparams; memset(&dispparams, 0, sizeof dispparams); dispparams.cArgs = nParamCount; dispparams.rgvarg = new VARIANT[dispparams.cArgs]; va_list ap; va_start(ap, nParamCount); for(int j = 0; j <nParamCount; j++) { CComBSTR bstr(va_arg(ap, char *)); bstr.CopyTo(&dispparams.rgvarg[j].bstrVal); dispparams.rgvarg[j].vt = VT_BSTR; } va_end( ap ); dispparams.cNamedArgs = 0; // EXCEPINFO excepInfo; memset(&excepInfo, 0, sizeof excepInfo); CComVariant vaResult; UINT nArgErr = (UINT)-1;// initialize to invalid arg hr = pScript->Invoke(dispid,IID_NULL,0,DISPATCH_METHOD,&dispparams,&vaResult,&excepInfo,&nArgErr); if(FAILED(hr)) return; } |
注 CSDN的代码带难用了