(一) 说明:
CLSID,IID,LIBID,APPID
进入注册表的只有CLSID,APPID和LIBID,IID永远只会沉默地呆在IDL里面
一个DLL或者一个EXE只有一个APPID
一个DLL或EXE里可以有N个CLSID(对象)
每个CLSID只会对应一个LIBID
第个CLSID可以有N个IID(接口)
其关系图如下:
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极少应用,准确说现在还没用过。