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的代码带难用了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值