RGS 文件的注册表映射






4.55/5 (15投票s)
2004年3月4日
2分钟阅读

121649

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 描述字符串的生命周期特别有用。