COM组件双接口对象模型
2024-10-06 15:08:47
模型如下:
这里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
最新文章
- autocomplete=";off"; 不起作用
- 如何获得DataGrid中某行某列的对象
- SQLSERVER2008R2正确使用索引
- file_get_contents()获取https出现这个错误Unable to find the wrapper “https” – did
- 史上最详细的Android Studio系列教程四--Gradle基础
- iOS ASIHTTPRequest 请求https
- 【LeetCode】202 - Happy Number
- NFS参数配置详细说明
- java service
- 怎样使用SetTimer MFC 够具体
- Linux 查公网出口IP
- ArcGIS API for JavaScript 4.2学习笔记[28] 可视域分析【使用Geoprocessor类】
- THUWC2019:Reach out
- [LeetCode] 63. Unique Paths II_ Medium tag: Dynamic Programming
- listener 监听 tomcat 容器的初始化和销毁
- 使用X.509数字证书加密解密实务(一)-- 证书的获得和管理
- 【Android】android文件的写入与读取---简单的文本读写context.openFileInput() context.openFileOutput()
- 无状态http协议上用户的身份认证
- SpringMVC框架09——@ResponseBody的用法详解
- 项目报错:Caused by: java.lang.ClassNotFoundException: Didn&#39;t find class ";...";on path: DexPathList
热门文章
- BeginInvoke异步线程
- 开发六年mybatisplus使用小结
- OpenGL学习脚印: uniform blocks在着色器中的使用 转自https://blog.csdn.net/wangdingqiaoit/article/details/52717963
- 实战 | 源码入门之Faster RCNN
- mysql全量和增量备份详解(带脚本)
- 【Jenkins】忘记admin密码,可以用此方法帮你解决
- ZZNU-OJ-2118 -(台球桌面碰来碰去,求总距离)——模拟到爆炸【超时】的不能AC的代码
- http协议头
- TCP中的长连接和短连接(转载)
- js获取链接?后边的参数名称或者值