之前只是有零散的概念,这次把这些信息都组织起来,备忘。
COM组件注册的时候,会往注册表中写入下面这几类信息:
- Interface
- Class
- Type Library
- AppID
- ProgID
因为HKEY_CLASSES_ROOT\下的键是从HKLM_Software\Classes\映射过去的,所以这两个地方都能找到(如果是32位组件的话,就要多一级WOW6432Node)
Interface
接口的信息会写入到HKEY_CLASSES_ROOT\Interface{Interface GUID}中
一般有两个子key:ProxyStubClsid32和TypeLib
看名知其意,这两个子key就是代理dll和类型库的信息
Class
COM类的信息会写入到HKEY_CLASSES_ROOT\CLSID{Class GUID}
这里写入的是关键信息,有下面几个子key:
- InprocServer32 (dll的路径和线程模型,如果是server的话,这里为LocalServer32)
- ProgID (字符串形式的接口名,方便JS这样的脚本使用,免得使用GUID这样的形式)
- TypeLib (类型库)
- VersionIndependentProgID (版本无关的接口名)
- Programmable
TypeLibrary
类型库的信息会写入到HKEY_CLASSES_ROOT\TypeLib{TypeLib GUID}
这里写入的是对应的组件dll路径
这里有个疑惑,构建时生成的tlb信息是放到注册表中还是dll的资源段,像js、vb等脚本语言是如何找到并加载这些类型库信息的?
AppID
注册表写入位置:HKEY_CLASSES_ROOT\AppID{组件文件名|{AppID GUID}}
写入内容:AppID的GUID,GUID对应的AppID,这个GUID好像是自动生成的,一般用不到
ProgID
注册表写入位置:HKEY_CLASSES_ROOT{带版本号和不带版本号的ProgID}
写入内容:对应的CLSID