COM组件主要是通过DLL来实现的,DLL暴露CreateInstance函数地址,客户程序加载对应组件的dll,然后调用CreateInstance得到组件的IUnknown接口,然后在调用QueryInterface查询组件支持的接口。
在实际使用ActiveX控件时,不需要每次用户程序使用输入组件的地址来加载组件,windows内部将组件的地址保存在了注册表中,用户程序使用组件时,可以通过组件的名字在注册表中查找组件的唯一标识符CLSID(也就是组件的UUID),并且找到组件的地址,从而加载组件。
注册表是一个由许多元素构成的层次结构,每一个元素均被称为一个关键字,每一个关键字可以包含一些列子关键字、一系列的值,如图所示,
COM组件只使用了注册表的第一个分支HKEY_CLASSES_ROOT,该分支下的以“.”开头的关键字是扩展名,记录每种类型的文件的打开方式。在HKEY_CLASSES_ROOT分支下有一个CLSID关键字,用于记录所有的com组件的CLSID与对应的组件名称(InProcserver32),InprocServer32保存了组件的具体位置
所有的组件都需要提供如下两个函数,用于将组件注册到注册表中:
STDAPI DllRegisterServer();
STDAPI DllUnregisterServer();
注册组件时,用户通过regsvr32.exe程序调用这两个函数,从而将组件注册到注册表中