ActiveX多线程回调JavaScript

公司下了一个新的要求
就是要在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的代码带难用了

发表评论