菜鸟是怎么练成的(四)

本文知识产权归karman所有,首发于博客中国(http://www.blogcn.com/blog/trackback.asp?mydiary=26596317),在CSDN作同步更新。如需转载,请保留本段文字,并发邮件通知:zhangmeng@sina.com

这几天在开发过程中遇到一个问题,即在网页中无法响应ActiveX控件自定义事件。经查资料后,明白ActiveX控件的事件如果要通过JavaScript等脚本语言响应,必须实现IProvideClassInfo或者IProvideClassInfo2接口。因为脚本语言必须通过这个接口获得控件的接口信息。

用MFC ActiveX Control Wizard生成的项目,其接口的实现是通过嵌套类完成,要实现IProvideClassInfo接口我们可以按下列步骤进行:
1. 在COleControl的继承类.h文件中加入代码:
     BEGIN_INTERFACE_PART(ProvideClassInfo, IProvideClassInfo)
         STDMETHOD_(HRESULT, GetClassInfo) ( 
                /*[out] */ITypeInfo** ppTI
          );
     END_INTERFACE_PART(ProvideClassInfo);

2. 在COleControl的继承类.cpp文件中加入代码,并实现接口:
    BEGIN_INTERFACE_MAP( CMetaKM_FC_BCtrl, COleControl )
        INTERFACE_PART(CMetaKM_FC_BCtrl, IID_IProvideClassInfo, ProvideClassInfo)
    END_INTERFACE_MAP()

ULONG FAR EXPORT CMetaKM_FC_BCtrl::XProvideClassInfo::AddRef()
{
    METHOD_PROLOGUE(CMetaKM_FC_BCtrl, ProvideClassInfo)
  return pThis->ExternalAddRef();
}

ULONG FAR EXPORT CMetaKM_FC_BCtrl::XProvideClassInfo::Release()
{
    METHOD_PROLOGUE(CMetaKM_FC_BCtrl, ProvideClassInfo)
  return pThis->ExternalRelease();
}

HRESULT STDMETHODCALLTYPE
CMetaKM_FC_BCtrl::XProvideClassInfo::QueryInterface (
 REFIID iid, void FAR* FAR* ppvObj)
{
 METHOD_PROLOGUE(CMetaKM_FC_BCtrl, ProvideClassInfo)
 return (HRESULT)pThis->ExternalQueryInterface(&iid, ppvObj);
}

HRESULT STDMETHODCALLTYPE
CMetaKM_FC_BCtrl::XProvideClassInfo::GetClassInfo (
              /* [out] */ITypeInfo** ppTI
              )
{
 METHOD_PROLOGUE(CMetaKM_FC_BCtrl, ProvideClassInfo)

 HRESULT hr;
 LPTYPELIB typeLib;
 CString str;
 hr = pThis->GetTypeLib( LANG_USER_DEFAULT, &typeLib );
 str.Format( _T("%x"), hr );
 AfxMessageBox( str );

 hr = typeLib->GetTypeInfo( 0, ppTI );
 str.Format( _T("%x"), hr );
 AfxMessageBox( str );
 return hr;
}

如果是用ATL COM Wizard生成的工程,那么在New ATL Object时可以选择Full Control,该选项默认已经实现IProvideClassInfo2接口。如果选择其他轻量级ActiveX对象,那么实现IProvideClassInfo2接口也相当容易。
因为ATL COM Wizard生成的工程,对于接口的实现时通过多重继承完成的,只有在接口定义中加入继承IProvideClassInfo2即可。
1. 在接口定义中加入:
    public IProvideClassInfo2Impl<&CLSID_MetaKM_FC_B, &DIID__IMetaKM_FC_BEvents, &LIBID_METAKM_FC_CTRLLib>
2.在BEGIN_COM_MAP(CMetaKM_FC_B)与END_COM_MAP()对中加入COM_INTERFACE_ENTRY(IProvideClassInfo)和COM_INTERFACE_ENTRY(IProvideClassInfo2)

本文知识产权归karman所有,首发于博客中国(http://www.blogcn.com/blog/trackback.asp?mydiary=26596317),在CSDN作同步更新。如需转载,请保留本段文字,并发邮件通知:zhangmeng@sina.com

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值