天天看点

COM中的各个ID分析

(一) 说明:

CLSID,IID,LIBID,APPID

进入注册表的只有CLSID,APPID和LIBID,IID永远只会沉默地呆在IDL里面

一个DLL或者一个EXE只有一个APPID

一个DLL或EXE里可以有N个CLSID(对象)

每个CLSID只会对应一个LIBID

第个CLSID可以有N个IID(接口)

其关系图如下:

COM中的各个ID分析

CLSID是对象的唯一标识,尽管LIBID原则上也是,但功能不一样,CLSID相当于在茫茫每个国家(AppID)中一户家庭的地址,LIBID是CLSID的副产品,相当于此户家庭的详细信息,IID相当于每一户家庭中每一成员的身份标识,也许一个家庭只有一个人,或许有N个人。

在COM的世界里,要某人为你做事,必须为此人创建一个家庭,用CLSID创建家庭,再由询问这个家庭的成员QueryInterface来获得想要的人,再用此人办事(调用此接口的函数或者属性)。

如果想知道这户家庭每个人的有什么能力的话,可以用LIBID获取此家庭的详细信息。

(二) 使用:

ØCLSID在工程中主要生存在IDL和REG里面,供客户创建对象调用。

ØLIBID的存在方式除了在IDL和REG里,还会存在代码中,一般用于由类型信息的场合。

类型信息:在COM编译的时候,由编译器生成的信息,直接存在DLL或EXE里面,客户可以通过LoadTypeLib或者LoadRegTypeLib获到类型信息,从而可以得到整个COM DLL或EXE里面的对象接口的所有信息。

如:IDispatchImpl和IProvideClassInfo2Impl里面都需要用到LIBID,IDispatchImpl是需要由字符得到DISPID,再执行,所以需要LIBID获得类型信息,进而调用。

IProvideClassInfo2Impl为客户提供事件(EVENT)详细的类型信息,必定需要LIBID获得类型信息

获得类型信息的方法如下:

LoadTypeLib或者LoadRegTypeLib得到ITypeLib

LoadTypeLib由文件路径生成ITypeLib

LoadRegTypeLib由LIBID生成ITypeLib

换句话说,如果客户获取类型信息需要LoadTypeLib,而本地要获得类型信息可以用LoadRegTypeLib

ØIID对应一个接口(interface)其值一般可以__uuidof(接口)得到,

ØAPPID极少应用,准确说现在还没用过。

继续阅读