注册表中已经有组件的CLSID、接口的IID 等信息,为什么COM还需要类型库???
类型库中同样也是有CLSID、接口的IID 等信息,为什么?

解决方案 »

  1.   

    类型库不单单包括CLSID和IID的声明(或/和定义),还包括接口方法的实现(转换)代码,注册表中是有CLSID、IID,但你都得在C++中声明、定义才能使用啊!
      

  2.   

    类型库干什么工作的你还没搞清楚!你在不同语言环境中导入你COM的类型库的时候编译器自动会产生一个如何该语言的一类型库副本,里面包括了说有接口ID和接口方法或属性的一些声明和接口方法中参数的自动转换!它的发布形式虽然是DLL,但是还有些不同之处就是多了一个类型库!
      

  3.   

    你可以这样理解,com就象一个类,客户程序要使用这个类必须提供.h和.cpp文件。不同于手工编写.h和.cpp的过程,com通过导入类型库来自动生成.h和.cpp文件。我的理解,大家讨论讨论,呵呵。
      

  4.   

    To:GnoDreamNa(only you)既然类型库已经提供了有关信息,为什么还要把CLSID等信息放进注册表,不是多余了吗?
      

  5.   

    一、VC编译器有这样一个特性,它可以读出COM类型库(.tlb文件),并提取其中声明的有关接口的类型库的详细资料,记住是“编译器”。
    二、程序在“运行期间”CoGetClassObject通过查注册表CLSID_Object,得知组件DLL的位置、文件名装入DLL库,使用函数GetProcAddress(...)得到DLL库中函数DllGetClassObject的函数指针。调用DllGetClassObject。它们的作用期间不同。
      

  6.   

    还有,如果你不用vc编写com的客户端,而是用vb来编写(其他的我不知道),那么你不需要自己引入tlb,而是直接利用clsid就可以创建com的客户端应用了。我相信,vb自己根据注册表里提供的clsid和其他信息自动引入了tlb。因此,clsid实际上为你提供了一个位置无关性的特点,使客户不需要知道com组件的位置,而只需要根据注册表的信息就可以使用该组件了。