模型如下:

这里COM对象一共实现了三个接口,IUnknown,IDispatch, Ixxx. 每个COM都必须实现IUnknown,不考虑在内的话共实现了IDispatch和自定义接口Ixxx两个,故称双接口对象。

IDispatch主要是给解释型语言脚本用的,因为脚本没办法直接调用多态的接口函数。

 #include <iostream>
using namespace std; class IUnknown
{
public:
virtual long QueryInterface( long riid, void * * ppvObject) = ;
virtual long AddRef( void) = ;
virtual long Release( void) = ;
}; class IDispatch : public IUnknown
{
public:
virtual void GetTypeInfoCount() = ;
virtual void GetTypeInfo() = ;
virtual void GetIDsOfNames() = ;
virtual void Invoke() = ;
}; class IMyDualTest : public IDispatch
{
public:
virtual long Add(long n1, long n2, long* pVal) = ;
}; class CMyDualTest: public IMyDualTest
{
public:
CMyDualTest():a(){}
// IUnknown
long QueryInterface( long riid, void * * ppvObject) { cout<<"QueryInterface"<<endl; return ;}
long AddRef( void) { cout<<"AddRef"<<endl; return ;}
long Release( void) { cout<<"Release"<<endl; return ;} // IDispatch
virtual void GetTypeInfoCount(){ cout<<"GetTypeInfoCount"<<endl;}
virtual void GetTypeInfo() { cout<<"GetTypeInfo"<<endl;}
virtual void GetIDsOfNames() { cout<<"GetIDsOfNames"<<endl;}
virtual void Invoke() { cout<<"Invoke"<<endl;} // IMyDualTest
long Add(long n1, long n2, long* pVal) { cout<<"Add"<<endl; return ;} private:
int a;
}; //typedef long (*QueryInterfaceType)( long riid, void * * ppvObject);
typedef long (*AddRefType)( void);
//typedef long (*ReleaseType)( void);
//
//typedef long (CMyTest::*QueryInterfaceClassType)( long riid, void * * ppvObject); void main()
{
CMyDualTest * pTest = new CMyDualTest; int * pFirst = (int*)(*(int*)pTest); for(int i=; i<; i++)
{
((AddRefType)(*(pFirst+i)))();
}
}

执行结果:

参考文章:

COM 组件设计与应用(八)——实现多接口    http://www.vckbase.com/index.php/wv/1236

COM组件双接口对象模型的更多相关文章

  1. COM组件多接口对象模型

    COM组件有两种接口类型,Dual and Custom,如下图所示.本文说的是Custom.所谓多接口COM对象是指此COM对象实现了多于一个的自定义接口,即Custom接口. 接口图如下: 需要注 ...

  2. COM组件 IDispatch 及双接口的调用

    转自:http://blog.csdn.net/cnhk1225/article/details/50555647 一.前言 前段时间,由于工作比较忙,没有能及时地写作.其间收到了很多网友的来信询问和 ...

  3. 【转载】COM 组件设计与应用(十一)—— IDispatch 及双接口的调用

    原文:http://vckbase.com/index.php/wv/1236.html 一.前言 前段时间,由于工作比较忙,没有能及时地写作.其间收到了很多网友的来信询问和鼓励,在此一并表示感谢.咳 ...

  4. Android开发之自定义组件和接口回调

    说到自定义控件不得不提的就是接口回调,在Android开发中接口回调用的还是蛮多的.在这篇博客开始的时候呢,我想聊一下iOS的自定义控件.在iOS中自定义控件的思路是继承自UIView, 在UIVie ...

  5. 【Android 应用开发】 自定义组件 宽高适配方法, 手势监听器操作组件, 回调接口维护策略, 绘制方法分析 -- 基于 WheelView 组件分析自定义组件

    博客地址 : http://blog.csdn.net/shulianghan/article/details/41520569 代码下载 : -- GitHub : https://github.c ...

  6. COM组件三大接口IUnknown、IClassFactory、IDispatch。

    转自:http://blog.csdn.net/chenyujing1234/article/details/7753863 (1)COM组件有三个最基本的接口类,分别是IUnknown.IClass ...

  7. 双接口(回调)promise cb

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. 【转载】COM 组件设计与应用(十)——IDispatch 接口 for VC.NET

    原文:http://vckbase.com/index.php/wv/1225.html 一.前言 终于写到了第十回,我也一直期盼着写这回的内容耶,为啥呢?因为自动化(automation)是非常常用 ...

  9. 【转载】COM 组件设计与应用(九)——IDispatch 接口 for VC6.0

    原文: http://vckbase.com/index.php/wv/1224.html 一.前言 终于写到了第九回,我也一直期盼着写这回的内容耶,为啥呢?因为自动化(automation)是非常常 ...

随机推荐

  1. 【vue开发】vue导出Excel表格教程&demo

    前端工作量最多的就是需求,需求就是一直在变,比如当前端数据写完之后,需要用Excel把数据下载出来:再比如前端在没有数据库想写些demo玩时,也是很好的选择. 第一步安装依赖包,修改配置 1.装依赖: ...

  2. 服务器CPU架构演变过程

    第一阶段: 单CPU,没啥好说的.和我们今天打游戏的台式机差不多. 第二阶段: 双CPU 或者 多CPU的SMP架构 或者 AMP架构.参考:http://www.lauterbach.com/smp ...

  3. 微信小程序开发(十二)Promise将异步改为同步

    // utils/utils.js /** * requestPromise用于将wx.request改写成Promise方式 * @param:{string} myUrl 接口地址 * @retu ...

  4. linq学习(二)

    百度搜索:C# linq查询新对象 直接从list中查出一个新对象集合. 文章:https://blog.csdn.net/lym940928/article/details/80278783 fro ...

  5. Octave基本语法

    基本运算 octave:3> 5+6 ans = 11 octave:4> 3-2 ans = 1 octave:5> 8*9 ans = 72 octave:6> 8/4 a ...

  6. Ubuntu系统---又显示nvidia-smi 未找到命令

    Ubuntu系统---又显示nvidia-smi 未找到命令 本来nvidia驱动+CUDA安装好用,两次遇到开机发现字体异常,不用合计,是显卡驱动的问题.一查,确实是nvidia-smi 未找到命令 ...

  7. ocr 识别 字体大小问题?

    字体大 字体小?????? ???????????

  8. webpack4.0打包优化策略整理小结

    本文转载于:https://www.jb51.net/article/137449.htm 介绍了webpack4.0打包优化策略整理小结,分享给大家,具体如下: webapck4 新特性介绍-参考资 ...

  9. 数组方法push() pop() shift() unshift() splice() sort() reverse() contact()浅拷贝 slice()原数组拷贝

    push() pop() shift() unshift() splice() sort() reverse() 参考资料:https://wangdoc.com/javascript/stdlib/ ...

  10. jQuery和原生JS的对比

    原生JS的缺点: 不能添加多个入口函数(window.onload),如果添加了多个,后面的会把前面的覆盖掉 原生js的api名字太长,难以书写,不易记住 原生js有的代码冗余 原生js中的属性或者方 ...