码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2014-06-10 12:57:03      阅读:642      评论:0      收藏:0      [点我收藏+]

标签:c   style   class   blog   code   a   

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

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

  • 1、如果不想直接提供成员作为属性,可以用成员函数的方式提供属性读写。 
    2、支持基类映射表,即如果基类也实现了映射表,派生类不用重复填表,自动合并基类表项。唯一的要求就是DISPID不要重复。 
    3、可以同时合并多个基类映射表。 
    4、添加可选参数支持,比如某个方法有5个参数,后3个为可选参数(有默认值),那么调用者可以只用2个参数来调用。 
    5、添加DISPID_VALUE支持,类似于VB中的对象默认属性。

简单的使用示例: 

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

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

标签:c   style   class   blog   code   a   

原文地址:http://www.cnblogs.com/honker/p/3778315.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!