idl文件有点看不懂解决办法
idl文件有点看不懂
下面是一个idl文件,前半部分看得懂,是在声明一个接口,后半部分看不懂了。
------解决方案--------------------
下面实质上是申明一个类似程序集的东西,如果你用C#调用过该COM组件,你就明白了,C#将其引用之后首先得 using BEGINNINGCOMLib;
------解决方案--------------------
1.这么理解应该也不算错。
2.coclass是用来实现接口。一个COM对象是coclass在内存中的一个实例(instance)。注意COM中的class跟C++中的class不是一个东西,虽然COM 的class 的实现通常都是C++ class。
------解决方案--------------------
这里描述的是类型库信息
看一下《com计数内幕》第十一章的第3节就知道怎么回事了
COM不仅追求C++编译器的中立,而且追求语言的独立性. 因此它使用IDL语言来描述接口. 然后在IDL到具体的语言之间建立映射.
但是一些数据类型在有些语言中难以表达。比如复杂的结构类型,指针类型,函数指针等等在一些弱类型的高级语言中比如Java, Visual Basic等等并没有得到支持. IDL到这些语言的映射不能顺利地进行. 客户通过接口调用对象时,在编译时刻需要接口的准确的描述, 这个描述正是来自于MIDL对IDL编译后产生的头文件, 而Java, VB等无法使用这种基于C/C++的头文件. COM的语言无关性受到很多的限制。
因此, MS使用类型库来解决这个问题. 类型库文件是一个二进制文件, 后缀为.tlb.用MIDL工具编译idl文件可以产生类型库文件,在实际的开发过程中不一定要手工使用MIDL工具,IDE对其进行了集成. 编译完成以后,我们可以选择把它随组件库一起分发. 类型库以机器可读的方式描述了组件与外界交互的必要信息. 如COM对象的CLSID, 它支持的接口的IID,接口的成员函数的签名等等. 本质上它等价于描述接口的C/C++头文件.
下面是一个idl文件,前半部分看得懂,是在声明一个接口,后半部分看不懂了。
import "oaidl.idl";
import "ocidl.idl";
[object, uuid(93C3840F-AD5A-4020-AAAB-313C4B61B184)]
interface IBeginningCOM : IUnknown
{
HRESULT Sum([in] int a, [in] int b, [out, retval] int *sum);
[propget] HRESULT Num([out, retval] int *pVal);
[propput] HRESULT Num([in] int val);
}
从这里开始看不懂了,谁能解释下,下面这是在干嘛呢?
[
uuid(D9161D4D-66C0-4ae6-9264-C322BDE034C7),
version(1.0),
helpstring("BeginningCOMLib")
]
library BEGINNINGCOMLib
{
importlib("stdole32.tlb");
importlib("stdole2.tlb");
[
uuid(586CDC7B-09F1-4f44-A110-F0E604AED81E),
helpstring("BeginningCOM Lib")
]
coclass BeginningCOM
{
[default] interface IBeginningCOM;
};
};
------解决方案--------------------
下面实质上是申明一个类似程序集的东西,如果你用C#调用过该COM组件,你就明白了,C#将其引用之后首先得 using BEGINNINGCOMLib;
------解决方案--------------------
1.这么理解应该也不算错。
2.coclass是用来实现接口。一个COM对象是coclass在内存中的一个实例(instance)。注意COM中的class跟C++中的class不是一个东西,虽然COM 的class 的实现通常都是C++ class。
------解决方案--------------------
这里描述的是类型库信息
看一下《com计数内幕》第十一章的第3节就知道怎么回事了
COM不仅追求C++编译器的中立,而且追求语言的独立性. 因此它使用IDL语言来描述接口. 然后在IDL到具体的语言之间建立映射.
但是一些数据类型在有些语言中难以表达。比如复杂的结构类型,指针类型,函数指针等等在一些弱类型的高级语言中比如Java, Visual Basic等等并没有得到支持. IDL到这些语言的映射不能顺利地进行. 客户通过接口调用对象时,在编译时刻需要接口的准确的描述, 这个描述正是来自于MIDL对IDL编译后产生的头文件, 而Java, VB等无法使用这种基于C/C++的头文件. COM的语言无关性受到很多的限制。
因此, MS使用类型库来解决这个问题. 类型库文件是一个二进制文件, 后缀为.tlb.用MIDL工具编译idl文件可以产生类型库文件,在实际的开发过程中不一定要手工使用MIDL工具,IDE对其进行了集成. 编译完成以后,我们可以选择把它随组件库一起分发. 类型库以机器可读的方式描述了组件与外界交互的必要信息. 如COM对象的CLSID, 它支持的接口的IID,接口的成员函数的签名等等. 本质上它等价于描述接口的C/C++头文件.