本文主要是介绍[COM]接口描述语言IDL,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、首先要清楚一点,使用IDL只是定义COM接口的一种方法(用C++也可以定义)。
IDL是一种语言,Microsoft Visual C++提供了MIDL工具,可以将IDL文件编译成C/C++兼容的接口描述头文件(.h)。
如下是用IDL写的一个IcwElement接口
- [
- object,
- uuid(0736591A-734E-4a3d-A1F0-150A50E402BB),
- helpstring("IcwElement Interface"),
- pointer_default(unique)
- ]
- interface IcwElement : IUnknown
- {
- [propget, helpstring("属性 Type")] HRESULT Type([out, retval] BSTR * type);
- [propget, helpstring("property Visible")] HRESULT Visible([out, retval] VARIANT_BOOL* pVal);
- [propput, helpstring("property Visible")] HRESULT Visible([in] VARIANT_BOOL newVal);
- [propget, helpstring("属性 Modified")] HRESULT Modified([out, retval] VARIANT_BOOL* pVal);
- [propput, helpstring("属性 Modified")] HRESULT Modified([in] VARIANT_BOOL newVal);
- };
使用MIDL编译后得到相应的C/C++代码如下:
- EXTERN_C const IID IID_IcwElement;
- #if defined(__cplusplus) && !defined(CINTERFACE)
- MIDL_INTERFACE("0736591A-734E-4a3d-A1F0-150A50E402BB")
- IcwElement : public IUnknown
- {
- public:
- virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Type(
- /* [retval][out] */ BSTR *type) = 0;
- virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Visible(
- /* [retval][out] */ VARIANT_BOOL *pVal) = 0;
- virtual /* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_Visible(
- /* [in] */ VARIANT_BOOL newVal) = 0;
- virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Modified(
- /* [retval][out] */ VARIANT_BOOL *pVal) = 0;
- virtual /* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_Modified(
- /* [in] */ VARIANT_BOOL newVal) = 0;
- };
- #else /* C style interface */
可见,生成的是C++代码,定义了一个抽象类,并有五个函数。函数名,参数,返回值,以及这个接口的GUID都是根据IDL文件自动生成的。
并且注意,生成的IcwElement类中是没有成员变量的,而成员变量的定义放在实现此接口的类中。
二、IDL中的接口一经修改,则需要改几个地方。由于接口改了,自动生成的.h文件也被修改,而因为其成员函数被写成纯虚函数,因而实现(继承)此接口的具体类处也必须实现这些纯虚成员函数。幸好,VS提供了工具自动完成这一套,我们只需向IDL的接口中添加属性,实现此接口的类便自动添加了相应的方法(put和get),当然具体类的成员变量需要自己添加。
参考:
1. 《COM原理与应用》——潘爱民
2. MSDN
这篇关于[COM]接口描述语言IDL的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!