模型如下:

这里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

最新文章

  1. autocomplete=&quot;off&quot; 不起作用
  2. 如何获得DataGrid中某行某列的对象
  3. SQLSERVER2008R2正确使用索引
  4. file_get_contents()获取https出现这个错误Unable to find the wrapper “https” – did
  5. 史上最详细的Android Studio系列教程四--Gradle基础
  6. iOS ASIHTTPRequest 请求https
  7. 【LeetCode】202 - Happy Number
  8. NFS参数配置详细说明
  9. java service
  10. 怎样使用SetTimer MFC 够具体
  11. Linux 查公网出口IP
  12. ArcGIS API for JavaScript 4.2学习笔记[28] 可视域分析【使用Geoprocessor类】
  13. THUWC2019:Reach out
  14. [LeetCode] 63. Unique Paths II_ Medium tag: Dynamic Programming
  15. listener 监听 tomcat 容器的初始化和销毁
  16. 使用X.509数字证书加密解密实务(一)-- 证书的获得和管理
  17. 【Android】android文件的写入与读取---简单的文本读写context.openFileInput() context.openFileOutput()
  18. 无状态http协议上用户的身份认证
  19. SpringMVC框架09——@ResponseBody的用法详解
  20. 项目报错:Caused by: java.lang.ClassNotFoundException: Didn&#39;t find class &quot;...&quot;on path: DexPathList

热门文章

  1. BeginInvoke异步线程
  2. 开发六年mybatisplus使用小结
  3. OpenGL学习脚印: uniform blocks在着色器中的使用 转自https://blog.csdn.net/wangdingqiaoit/article/details/52717963
  4. 实战 | 源码入门之Faster RCNN
  5. mysql全量和增量备份详解(带脚本)
  6. 【Jenkins】忘记admin密码,可以用此方法帮你解决
  7. ZZNU-OJ-2118 -(台球桌面碰来碰去,求总距离)——模拟到爆炸【超时】的不能AC的代码
  8. http协议头
  9. TCP中的长连接和短连接(转载)
  10. js获取链接?后边的参数名称或者值