ActiveX调用JS

//IHTMLDocument2 必须包含一下三个头文件
#include <atlbase.h>
#include "atlconv.h"
#include "Mshtml.h"

using namespace ATL; //CComPtr



void CViewDialog::OnBnClickedButton2()
{
 
	 
	IOleClientSite*   pClientSite = this->pClientSite;
	HRESULT   hr   =   S_OK;   //HRESULT 是一种简单的数据类型,通常被属性和 ATL 用作返回值
	IServiceProvider   *isp,   *isp2   =   NULL;//用于导航DHTML对象层次,作用就是提供服务 

	IWebBrowser2 *browser;

	if(!pClientSite){ 
       if(browser!=NULL){
            browser->Release();
            browser = NULL;
       }
       return; 
     }else{ 
		hr = pClientSite->QueryInterface(IID_IServiceProvider,   reinterpret_cast<void   **>(&isp)); 
		if(FAILED(hr))
		{ 
             hr = S_OK; 
             if(isp!=NULL)
			 {
				  isp->Release();
				  isp = NULL;
			  }
		} 
        hr = isp->QueryService(SID_STopLevelBrowser,   IID_IServiceProvider,   reinterpret_cast<void   **>(&isp2)); 
        if(FAILED(hr))
		{ 
            hr = S_OK; 
            if(isp2!=NULL)
			{
				isp2->Release();
				isp2 = NULL;
			}
        } 
       //获得浏览器 
       hr   =   isp->QueryService(SID_SWebBrowserApp,   IID_IWebBrowser2,   reinterpret_cast<void   **>(&browser));
       if(FAILED(hr))   
       { 
             hr   =   S_OK; 
             if(browser!=NULL)
			 {
					browser->Release();
					browser = NULL;
			  }
       } 
      } 
	 if(!browser) { 
			if(browser!=NULL)
			{
				browser->Release();
				browser = NULL;
			}
			//CString strBrowser;
			//MessageBox((strBrowser="浏览器获取失败..."));
			return; 
	  }

	 CComPtr<IHTMLDocument2>  m_spDoc;  //定义HTML的DOCUMENT
	 hr = browser->get_Document((IDispatch**)&m_spDoc);   
     if(FAILED(hr)){ 
         throw(""); 
	 }
	
	 CComPtr<IDispatch> pScript; 
	 hr = m_spDoc->get_Script(&pScript); 
	 if(FAILED(hr)){ 
         throw(""); 
	 }
 
	 CComBSTR   bstrMember("callback");   //html前端的javascript函数的名称
	 DISPID   dispid; 
	 hr=pScript->GetIDsOfNames(IID_NULL,&bstrMember,1,LOCALE_SYSTEM_DEFAULT,&dispid); 
	 
	 //设置函数参数 
	DISPPARAMS   dispparams; 
	memset(&dispparams,0,sizeof(dispparams)); 

	UINT argsNum = 3;//有三个参数
	dispparams.cArgs = argsNum;//callback函数的参数个数,注意从这里传进javascript函数的参数是相反的。

	dispparams.rgvarg = new VARIANT[dispparams.cArgs];//表示对参数数组的引用。 

	
	for(int i = 0; i < argsNum; i++) 
	{ 
        //dispparams.rgvarg[i].iVal = m_param;
		//传递字符串
		CString  strmac;
	    strmac="12345123451234512345";
		BSTR bstr = strmac.AllocSysString();
		dispparams.rgvarg[i].bstrVal = bstr;
		dispparams.rgvarg[i].vt = VT_BSTR;

		//传递short
		//SHORT aa = 800;
		//dispparams.rgvarg[i].iVal = aa;
        //dispparams.rgvarg[i].vt = VT_I2; 
	} 

	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); 
 
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值