本文知识产权归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

菜鸟是怎么练成的(四)相关推荐

  1. 骆俊武:编程高手是如何练成的?

    每个人都有成长的渴望,也都会遇到成长的瓶颈.下面这个问题是一个读者问我的: 如何才能训练成为一个编程高手? 先简单说下这个读者的背景:工作 3 年多,目前在大厂做后台开发,身边有不少编程高手,是他想要 ...

  2. 编程高手是如何练成的?

    每个人都有成长的渴望,也都会遇到成长的瓶颈.下面这个问题是一个读者问我的: 如何才能训练成为一个编程高手? 先简单说下这个读者的背景:工作 3 年多,目前在大厂做后台开发,身边有不少编程高手,是他想要 ...

  3. 在线直播源码评论弹幕是如何“练”成的?

    在线直播源码评论弹幕是如何"练"成的? 提起弹幕(dànmù),大家都会想到「视频弹幕」.视频弹幕是指网友们在观看视频的同时参与评论,即所谓"即时反馈", 评论 ...

  4. Python百练成钢002-计算自幂数

    这是[Python 百练成钢]系列文章的第 002 篇,计划完成 100 道练习题. 本文环境:python3.8 计算自幂数 什么是自幂数? 自幂数:也叫超完全数字不变数.自恋数.阿姆斯特朗数(Ar ...

  5. 仿站高手是怎么练成的 分析仿站必备知识总结

    仿站高手是怎么练成的 分析仿站必备知识总结 来源:http://hep6.com 作者:和平 现在的网站,真正原创设计的没有几个,都是我抄袭你,你抄袭我,再自己修改下,这可能跟中国的国情有关吧!抄袭网 ...

  6. 小强怎样练成——读《现代软件工程——构建之法》第三章有感

    小强怎样练成 ----读<现代软件工程--构建之法>第三章有感 一.知道自己吃几碗干饭 先秦时期的"革命家"告诉我们"知人者智,自知者明",&quo ...

  7. 李小龙:超人是这样练成的

    李小龙:超人是这样练成的 李小龙:超人是这样练成的 作者:约翰·立托 本文原载于美国<肌肉与健美>(Muscle. Fitness)杂志1994年3月号.<肌肉与健美>杂志由世 ...

  8. 著名弹跳训练法 练成可提高30cm

    搜狐体育讯 怎样提高弹跳一直是广大篮球迷最关注的话题之一,下面我们就为大家推荐一种弹跳训练方法--美国最著名纵跳训练计划, 练成后预计纵跳能力(也就是原地弹跳)可以提高20到30厘米以上, 不过锻炼过 ...

  9. 牛逼的C/C++程序员是如何练成的?

    这个题目的噱头太大,要真的写起来, 足够写一本书了. 牛耳人分享一些经验,希望能让初学的小伙伴少走弯路. 每个人的情况不一样,所以下面的描述可能并不适合每一个看到这篇文章的人. 一.C/C++语言 如 ...

最新文章

  1. 大推荐——家庭书架·成功读库系列
  2. ListView中添加Button后,Button的点击事件和ListView的点击事件冲突
  3. PHP算法使用__call优化代码
  4. 中国已消失的九所世界级大学
  5. 实现织梦dedecms百度主动推送(实时)网页抓取
  6. 图论 —— 环与块 —— 连通块的计数
  7. 【GCN】从文本分类来看图卷积神经网络
  8. Docker系列(二):Docker安装
  9. 游戏开发3D基础知识
  10. 实战案例:探索星巴克的世界分布
  11. springboot中得注解_SpringBoot 中的基本注解
  12. VMware利用unlocker开启MacOS支持
  13. ssh的发展历程与基本原理
  14. 第8周项目5:定期存款利息计算器
  15. 【风马一族_php】
  16. activeMQ基础学习和SpringBoot整合activeMQ案例
  17. 非此即彼的逻辑错误_英语逻辑错误一览
  18. gamepad android手柄,CF手游手柄怎么玩 CF手游怎么设置安卓手柄
  19. vbs新年祝福,怎么样
  20. 长期出差补助减半,这谁还愿意出差啊

热门文章

  1. 感谢vmware软件公司
  2. 四大组件之Service(三)-Service的跨进程调用
  3. 有重要的事在华为手机上如何设置提醒?
  4. 聚簇索引与非聚簇索引的区别以及SQL Server查询优化技术(评论很精彩)
  5. 李萨如(3)--- 随相位变的动画
  6. 宝宝无人看管? 谷歌婴儿监控AI来当保姆!
  7. TypeError: fit() missing 1 required positional argument: 'y'
  8. 树莓派驱动数码管c 语言,树莓派GPIO入门05-驱动数码管显示数字
  9. Python根据输入的公司编号、名称、网址,格式化输出公司信息。其中1)冒号统一为英文冒号,编号占6位,不足6位的前面补0。编号后面是制表符。
  10. 游戏SDK应用内悬浮窗的实现(三)