这几天在开发过程中遇到一个问题,即在网页中无法响应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作同步更新。如需转载,请保留本段文字,并发邮件通知:
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/karman/archive/2006/04/09/656088.aspx