65.9K
CodeProject 正在变化。 阅读更多。
Home

RGS 文件的注册表映射

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.55/5 (15投票s)

2004年3月4日

2分钟阅读

viewsIcon

121649

downloadIcon

1046

允许在 RGS 文件中使用自定义标签以保持 GUID 同步。

引言

RGS 文件是一个很好的概念,它允许在 ATL 中进行一些巧妙的自定义注册,而无需处理注册表 API。

然而,似乎 ATL 的编写者从未完成注册表资源的编写。他们甚至错过了添加另一个#define宏映射的机会。由于缺少几个宏,替换的全部功能从未实现。

一个非常令人烦恼的结果是,每当你更改 IDL 文件的 CLSID、LIBID 或其他属性时,都需要在RGS 文件中反映此更改。举手,有多少人不止一次忘记这样做!(我当然有)。

此实用程序添加了缺少的宏,允许用户添加一个RGS 替换映射,该映射可以包含UUID以及字符串。

用法

通过使用DECLARE_REGISTRY_RESOURCEID_EX(ResourceId)代替DECLARE_REGISTRY_RESOURCEID(ResourceId)来启用额外的功能。使用的资源条目可以采用更通用的格式,而不是当前所需的特定RGS 文件。这通常放在头文件中的类声明中。

然后,与所有 Microsoft 宏映射一样,需要一个映射部分,以BEGIN_REGISTRY_MAP(Class)开头,以END_REGISTRY_MAP()结尾。注册表映射内包含一个列表,其中包含三种形式之一的条目

  • REGMAP_ENTRY(var,subst) 使用给定的字符串替换变量。
  • REGMAP_RESOURCE(var,resid) 使用指定资源给出的字符串替换变量。
  • REGMAP_UUID(var,clsid) 使用UUID的字符串表示形式替换变量。

标准 COM 库的 RGS 文件如下所示

HKCR
{
    %PROGID%.%VERSION% = s '%DESCRIPTION%'
    {
        CLSID = s '%CLSID%'
    }
    %PROGID% = s '%DESCRIPTION%'
    {
        CLSID = s '%CLSID%'
        CurVer = s '%PROGID%.%VERSION%'
    }
    NoRemove CLSID
    {
        ForceRemove %CLSID% = s '%DESCRIPTION%'
        {
            ProgID = s '%PROGID%.%VERSION%'
            VersionIndependentProgID = s '%PROGID%'
            ForceRemove 'Programmable'
            InprocServer32 = s '%MODULE%'
            {
                val ThreadingModel = s '%THREADING%'
            }
            'TypeLib' = s '%LIBID%'
        }
    }
}

下一步是声明一个替换映射。这使用与大多数 Microsoft 声明映射相同的格式。如果使用上面的“RGS”文件,则映射看起来像这样

BEGIN_REGISTRY_MAP(CClassName)
    REGMAP_ENTRY("PROGID",      "MyLibrary.ClassName")
    REGMAP_ENTRY("VERSION",     "1")
    REGMAP_ENTRY("DESCRIPTION", "ClassName Class")
    REGMAP_UUID ("CLSID",       CLSID_ClassName)
    REGMAP_UUID ("LIBID",       LIBID_MyLibraryLib)
    REGMAP_ENTRY("THREADING",   "Apartment")
END_REGISTRY_MAP()

这需要放在类声明中,所以我通常将其放在DECLARE_REGISTRY_RESOURCEID_EX声明的正下方。

额外宏的幕后是一个struct _ATL_REGMAP_ENTRY的简单包装器,它进行一些资源管理,这对于管理 GUID 描述字符串的生命周期特别有用。

© . All rights reserved.