转:宏定义的极致发挥---让你的普通C++类轻松支持IDispatch自动化接口(二)

时间:2014-06-10 12:57:03   收藏:0   阅读:642

Posted on 2011-01-13 20:44 一桶浆糊

这是上一篇博客《宏定义的极致发挥---让你的普通C++类轻松支持IDispatch自动化接口》所展示的示例代码的改进版,改进之处有:

简单的使用示例: 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class CAnimal
{
public:
    bool Sex;
 
    Begin_Disp_Map(CAnimal)
        Disp_Property(1, Sex, bool)
    End_Disp_Map()
};
 
class CDog : public CAnimal
{
public:
    CString Name;
    long Height;
 
    void Drink();
    bool Eat(long lType, long lNum);
 
    HRESULT GetName(VARIANT* pvName);
    HRESULT SetName(VARIANT* pvName);
 
    Begin_Disp_Map(CDog, CAnimal)
        Disp_Property(2, Name)
        Disp_PropertyGet(3, Height, long)
        Disp_Method(4, Drink, void, 0)
        Disp_Method(5, Eat, bool, 2, long, long)
    End_Disp_Map()
};

  

从示例代码看出跟原始版本有如下不同:

1. 基类CAnimal也有映射表,意思是基类可以独立变成自动化对象。 
2. CDog可以继承CAnimal的映射表,只需要把基类名加在起始表项里,Begin_Disp_Map(CDog, CAnimal)。如果不想继承基类映射表,去掉基类类名即可,例如 Begin_Disp_Map(CDog)。如果CDog同时派生自另一个也有映射表的基类,比如CFourLegs,可以这样写 Begin_Disp_Map(CDog, CAnimal, CFourLegs)。这样做的话,CDog 将自动拥有 Sex 属性。 
3. Name属性将不再直接处理 Name 成员变量,而是通过GetName/SetName来读取和设置,具体的类型转换将由两个函数完成。

以上并没有列举具有可选参数的方法的填表用法,稍微有点复杂,有时间的话在下一篇介绍。

好了,下面是完整的头文件:

  

转:宏定义的极致发挥---让你的普通C++类轻松支持IDispatch自动化接口(二),布布扣,bubuko.com

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!