一 、COM组件的在注册表的信息
- com注册信息全部存在于注册表的HKEY_CLASSES_ROOT键下,最主要的是CLSID子健。在CLS子键下,列除了当前机器上所有组件的信息。
- 如果是进程内组件,则CLSID 下包含了 InprocServer32子键,该自己的缺省值为组建程序的全路径;如果是进城外组件,CLSID子键下包含了LocalServer32子键,该子键缺省值为组件程序的全路径。
- 在CLSID子键下海可以包含一些其他相关信息,如 版本信息, OLE组件的InprocHandle32子键,组件程序的图标信息,组建程序的类型库等。
- 在HKEY_CLASSES_ROOT键下,除了CLSID子键与COM组件直接相关外,还有Interface子键给出了当前系统中一些COM接口的配置信息,以及TypeLib子键给出了当前系统中类型库的信息。例如,进城外组件的接口配有对应的代理和存根DLL,这些信息被保存在Interface子键下的ProxyStub 或者ProxyStubClsid32中。
- 标示一个COM对象的另外一个字符串标示:ProgID被直接放在HKEY_CLASSES_ROOT键下, 例如在键下可以直接找到"COMctl.TreeCtrl"子键,这是树形控件的ProgID。而且该键值下还可以再包含 CLSID和CurVer这样的子键。 函数CLSIDFromProgID ProgIDFromCLSID可以分别转换CLSID ProgID。
- COM提供了对注册表中组件分类机制:如果COM支持同样一组接口,则分到同一个类中。 一个COM对象可以分到多个类中。 例如所有的自动化对象都支持IDispatch接口,则它们可以归成一类 "Automation Objects"。 类别信息可以用128位的GUID描述,称为:CATID。 在每个对象的CLSID键下包含一个"Implement Categories"子键,包含了该对象的隶属的类别列表。
- 在HKEY_CLASSES_ROOT键下有一个子键"Component Categories",包含了当前机器山所有的组件类别, 其中列出了每个组件的CATID。 使用vc提供的oleview.exe 可以列出当前机器上所有的类别信息。
二、 COM组件的注册操作
- 组件程序分为自注册组件程序(self-reistering)与非自注册组件程序。对于非注册程序必须编写单独的注册程序,这里不讨论。
- 进城内的自注册组件程序是动态库DLL,需要提供两个入口函数供注册工具regsvr32:bool DLLRegisterServer(...) 和 bool DLLUnregisterServer(...)。
- 进城外的组件程序本身是可执行程序,而且他不能提供入口函数供其他程序调用,因此在COM规范中规定,支持自注册的进城外组件必须支持两个命令行参数: /RegServer 和 /UnregServer 或者可以是:-RegServer 和 -UnregServer。 如果程序注册成功则返回0, 否则返回非0值表示注册失败。