[COM]接口描述语言IDL

一、首先要清楚一点,使用IDL只是定义COM接口的一种方法(用C++也可以定义)。

IDL是一种语言,Microsoft Visual C++提供了MIDL工具,可以将IDL文件编译成C/C++兼容的接口描述头文件(.h)。

如下是用IDL写的一个IcwElement接口

[plain]  view plain copy
  1. [  
  2.     object,  
  3.     uuid(0736591A-734E-4a3d-A1F0-150A50E402BB),  
  4.     helpstring("IcwElement Interface"),  
  5.     pointer_default(unique)  
  6. ]  
  7. interface IcwElement : IUnknown  
  8. {  
  9.     [propget, helpstring("属性 Type")] HRESULT Type([out, retval] BSTR * type);  
  10.     [propget, helpstring("property Visible")] HRESULT Visible([out, retval] VARIANT_BOOL* pVal);  
  11.     [propput, helpstring("property Visible")] HRESULT Visible([in] VARIANT_BOOL newVal);              
  12.     [propget, helpstring("属性 Modified")] HRESULT Modified([out, retval] VARIANT_BOOL* pVal);  
  13.     [propput, helpstring("属性 Modified")] HRESULT Modified([in] VARIANT_BOOL newVal);  
  14. };  
其中有一些关键字可以参考MSDN: http://msdn.microsoft.com/en-us/library/aa367088(v=vs.85).aspx

使用MIDL编译后得到相应的C/C++代码如下:

[cpp]  view plain copy
  1. EXTERN_C const IID IID_IcwElement;  
  2.   
  3. #if defined(__cplusplus) && !defined(CINTERFACE)  
  4.       
  5.     MIDL_INTERFACE("0736591A-734E-4a3d-A1F0-150A50E402BB")  
  6.     IcwElement : public IUnknown  
  7.     {  
  8.     public:  
  9.         virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Type(   
  10.             /* [retval][out] */ BSTR *type) = 0;  
  11.           
  12.         virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Visible(   
  13.             /* [retval][out] */ VARIANT_BOOL *pVal) = 0;  
  14.           
  15.         virtual /* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_Visible(   
  16.             /* [in] */ VARIANT_BOOL newVal) = 0;  
  17.           
  18.         virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Modified(   
  19.             /* [retval][out] */ VARIANT_BOOL *pVal) = 0;  
  20.           
  21.         virtual /* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_Modified(   
  22.             /* [in] */ VARIANT_BOOL newVal) = 0;  
  23.           
  24.     };  
  25.       
  26. #else   /* C style interface */  

可见,生成的是C++代码,定义了一个抽象类,并有五个函数。函数名,参数,返回值,以及这个接口的GUID都是根据IDL文件自动生成的。

并且注意,生成的IcwElement类中是没有成员变量的,而成员变量的定义放在实现此接口的类中。

二、IDL中的接口一经修改,则需要改几个地方。由于接口改了,自动生成的.h文件也被修改,而因为其成员函数被写成纯虚函数,因而实现(继承)此接口的具体类处也必须实现这些纯虚成员函数。幸好,VS提供了工具自动完成这一套,我们只需向IDL的接口中添加属性,实现此接口的类便自动添加了相应的方法(put和get),当然具体类的成员变量需要自己添加。

参考:

1. 《COM原理与应用》——潘爱民

2. MSDN

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值