公司下了一个新的要求
就是要在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的代码带难用了
本文介绍了如何解决OCX组件中的线程问题,通过使用IWebBrowser2接口实现在线程中安全地调用JavaScript方法,确保Web页面能正确响应控件事件。
2208

被折叠的 条评论
为什么被折叠?



