ATL与JavaScript交互

原帖地址:http://www.followman.com/bbs/Topic-B11-T262.aspx

 

JavaScript动态响应ATL事件

相关讨论:http://topic.csdn.net/t/20061012/21/5078729.html
重 点:脚本传过来的对象是IDispatch接口,应该用IDispatch::Invoke来调用。如果传过来的是个function,那么DISPID 为0,如果是个对象,那么要先用GetIDsOfNames得到DISPID,再Invoke。

相关讨论2:http://topic.csdn.net/u/20080418/12/3c09eb2c-fbb4-419f-8a6e-50d78ba8ff2d.html

控件要实现事件来调用JS脚本,应该使用属性,因为JS语言本身并不支持连接点。假设你的控件是ICtrl,要添加一个FirstEvent事件, 像下面这样做:
IDL:
[propput]HRESULT FirstEvent(VARIANT* pEvent);

.h:
class CCtrl : public ICtrl
{
  __stdcall HRESULT put_FirstEvent(VARIANT* pEvent);
  CComQIPtr <IDispatch> m_spEvent;

  void Fire_FirstEvent(VARIANT sType, VARIANT Msg);
}

.cpp:
HRESULT __stdcall CCtrl::put_FirstEvent(VARIANT* pEvent)
{
  assert(pEvent->vt == VT_DISPATCH);
  m_spEvent = V_DISPATCH(pEvent);
  return S_OK;
}

void CCtrl::Fire_FirstEvent(VARIANT sType, VARIANT Msg)
{
  if (m_spEvent)
  {
    CComVariant args[2] = {sType, Msg};
    DISPPARAMS dp = {args, NULL, 2, 0};
    m_spEvent->Invoke(0, IID_NULL, LOCALE_USE_DEFAULT, DISPATCH_METHOD, &dp, NULL, NULL, NULL);
  }
}

成功实例:
IDL部分:
 [propget, id(2), helpstring("属性 OnShowText")] HRESULT OnShowText([out, retval] IDispatchEx** pVal);
 [propput, id(2), helpstring("属性 OnShowText")] HRESULT OnShowText([in] IDispatchEx* newVal);
JS部分:

function  CreateATL()
{
    
this .vv  =   " ok " ;
    m 
=   new  ActiveXObject( " ATLPro.AControl " );
    m.OnShowText 
=   function () // OnShowText 在ATL中是一个 IDispatchEx 对象
     {
        a lert(
this .vv);
    }

}

.cpp部分:

STDMETHODIMP CAControl::ShowText(BSTR v)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());

    
    HRESULT hr;
    VARIANT var;
    DISPPARAMS dispparams 
=   {NULL, NULL,  0 0 } ;
    DISPID dispid 
=   0 ;

    hr 
=   this -> m_OnShowText -> InvokeEx(dispid, LOCALE_USER_DEFAULT, 
         DISPATCH_METHOD, 
& dispparams, 
         
& var, NULL, NULL);
         
if  (FAILED(hr))
         
{}

    
return  S_OK;
}


向JavaScript函数传递参数:

DISPPARAMS dispparams;
memset(
& dispparams,  0 sizeof  dispparams);
dispparams.cArgs 
=   2 ;
dispparams.rgvarg 
=   new  VARIANT[dispparams.cArgs];
 
for int  i  =   0 ; i  <   2 ; i ++ )
{
    CComBSTR bstr 
=   " 111 " //  back reading
    bstr.CopyTo( & dispparams.rgvarg[i].bstrVal);
    dispparams.rgvarg[i].vt 
=  VT_BSTR;
}

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


使用IDispatchEx接口:
在自定义类中添加头文件
#include "dispex.h"
在idl文件中 包含IDL文件
import "dispex.idl";

相关参考:
http://msdn.microsoft.com/en-us/library/sky96ah7(VS.85).aspx
ActiveX 线程技术:http://www.cnblogs.com/phinecos/archive/2008/12/29/1364791.html

查看http://www.followman.com/phone 可以查看详细的借口说明。完全免费使用,欢迎大 家使用。

更多接口本站即将推出。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值