代码改变世界

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