idl文件有点看不懂解决办法

idl文件有点看不懂
下面是一个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;
------解决方案--------------------
引用:
library BEGINNINGCOMLib 

    importlib("stdole32.tlb"); 
    importlib("stdole2.tlb"); 
 
    [ 
        uuid(586CDC7B-09F1-4f44-A110-F0E604AED81E), 
        helpstring("BeginningCOM Lib") 
    ] 
    coclass BeginningCOM 
    { 
        [default] interface IBeginningCOM; 
    }; 
};


1、这是不是在声明一个库,库里面可以包含好多接口?
2、这段代码是不是把对象类和接口联系起来?
coclass BeginningCOM 
    { 
        [default] interface IBeginningCOM; 
    };

    不加这段代码,好像也可以正常使用啊。
3、后半部分代码是不是不是给C++用的,我不加也可以使用这个组件?


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++头文件.