作者: Jim Wang 公众号: 巴博萨船长

Windows 注册表

HKEY_CLASSES_ROOT在此关键字之下,可以看见有一个CLSID关键字。在CLSID关键字之下列有系统中安装的所有组件的CLSID。注册表CLSID是一个具有如下格式的串:00000010-0000-0010-8000-00AA00D2EA4

HKEY_CLASSES_ROOT的开头,列出了将是各种应用程序所注册的文件扩展名。在扩展名之后,可以看到许多其它的名字。此类名字大多数被称作是ProgID,表示是程序员定义的标识符。某些名称表示的不是ProgID而实一些特殊的关键字。

如:

  • CLSID
  • AppID,此关键字下的子关键字的作用是将某个APPID(应用程序的ID)映射成某个远程服务器名称。分式COM(DCOM)将用到此关键字。
  • 组件类别,注册表的这一分支可以将CATID(组件类别ID)映射成某个特定的组件类别。
  • Interface,此关键字将用于将IID映射成某个接口相关的信息。这些信息主要用于在跨进程边界使用接口的情况。
  • Licenses,保存的是授权使用COM组件的一些认可信息。
  • TypeLib,类型库关键字保存的是关于接口成员函数所用的参数的信息。另外还有一些信息。此关键字可以将一个LIBID映射成存储类型库的文件名称。

ProgID

所谓ProgID指的是程序员给某个CLSID指定的一个程序员易记的名称。ProgID命名规则为:..,如下图:

如WPDSp.WPDServiceProvider是版本无关ProgID,根据其值可在CLSID下找到相应键,进而找到相应信息,如组件最新版本信息。

WPDSp.WPDServiceProvider.1是版本相关ProgID,根据其CLSID值可以找到该版本组件的信息。

ProgID注册表格式

ProgID及与版本无关的ProgID被列在组件CLSID下面。

ProgID的主要作用是获取相应的CLSID。在每一个CLSID项中查找查个ProgID将非常低效的。因此在其下面也将直接列出ProgID。由于ProgID不是针对最终用户而定义的,因此ProgID关键字的缺省值为用户易记的名称。在之下有一个名为CLSID的关键字,其缺省值为组件的CLSID。如下图所示:

与版本好无关的ProgID也直接被列在HKEY_CLASSES_ROOT下面。它们还有另外一个关键字CurVer,其缺省值为组件当前版本的ProgID,如下图:

ProgID和CLSID的转换

  • CLSIDFromProgID
  • ProgIDFromCLSID

组件的自注册

为把组件注册到注册表,在DLL中一定要输出如下两个函数:

STDAPI DllRegisterServer(); //注册

STDAPI DllUnregisterServer(); //反注册

我们使用Regsvr32.exe注册某个组件或者反注册某个组件时,其实就是调用这两个函数的过程。


版权声明:
文章首发于 Jim Wang's blog , 转载文章请务必以超链接形式标明文章出处,作者信息及本版权声明。