COM组件双接口对象模型
2013-08-04 14:54 Dirichlet 阅读(662) 评论(0) 收藏 举报模型如下:


这里COM对象一共实现了三个接口,IUnknown,IDispatch, Ixxx. 每个COM都必须实现IUnknown,不考虑在内的话共实现了IDispatch和自定义接口Ixxx两个,故称双接口对象。
IDispatch主要是给解释型语言脚本用的,因为脚本没办法直接调用多态的接口函数。
1 #include <iostream> 2 using namespace std; 3 4 class IUnknown 5 { 6 public: 7 virtual long QueryInterface( long riid, void * * ppvObject) = 0; 8 virtual long AddRef( void) = 0; 9 virtual long Release( void) = 0; 10 }; 11 12 class IDispatch : public IUnknown 13 { 14 public: 15 virtual void GetTypeInfoCount() = 0; 16 virtual void GetTypeInfo() = 0; 17 virtual void GetIDsOfNames() = 0; 18 virtual void Invoke() = 0; 19 }; 20 21 class IMyDualTest : public IDispatch 22 { 23 public: 24 virtual long Add(long n1, long n2, long* pVal) = 0; 25 }; 26 27 class CMyDualTest: public IMyDualTest 28 { 29 public: 30 CMyDualTest():a(10){} 31 // IUnknown 32 long QueryInterface( long riid, void * * ppvObject) { cout<<"QueryInterface"<<endl; return 1;} 33 long AddRef( void) { cout<<"AddRef"<<endl; return 1;} 34 long Release( void) { cout<<"Release"<<endl; return 1;} 35 36 // IDispatch 37 virtual void GetTypeInfoCount(){ cout<<"GetTypeInfoCount"<<endl;} 38 virtual void GetTypeInfo() { cout<<"GetTypeInfo"<<endl;} 39 virtual void GetIDsOfNames() { cout<<"GetIDsOfNames"<<endl;} 40 virtual void Invoke() { cout<<"Invoke"<<endl;} 41 42 // IMyDualTest 43 long Add(long n1, long n2, long* pVal) { cout<<"Add"<<endl; return 1;} 44 45 private: 46 int a; 47 }; 48 49 //typedef long (*QueryInterfaceType)( long riid, void * * ppvObject); 50 typedef long (*AddRefType)( void); 51 //typedef long (*ReleaseType)( void); 52 // 53 //typedef long (CMyTest::*QueryInterfaceClassType)( long riid, void * * ppvObject); 54 55 void main() 56 { 57 CMyDualTest * pTest = new CMyDualTest; 58 59 int * pFirst = (int*)(*(int*)pTest); 60 61 for(int i=0; i<8; i++) 62 { 63 ((AddRefType)(*(pFirst+i)))(); 64 } 65 }
执行结果:

参考文章:
COM 组件设计与应用(八)——实现多接口 http://www.vckbase.com/index.php/wv/1236
浙公网安备 33010602011771号