如何以编程方式更新 .rgs 文件以反映在 IDL 文件中所做的更改?

How to programmatically update .rgs files to reflect changes made in IDL files?

是否有任何工具可以更新 .rgs files 以反映在 IDL 中所做的更改?

rgs 文件是由 ATL 控件向导创建的,但我找不到刷新这些文件的方法。

当我们更改接口的 uuid(在 .IDL 文件中)时,我们被迫手动更改这些 .rgs 文件中的 "hard copy" 值。这很容易出错。

我发现 this interesting project 打算填补这个空白,但是,根据最后的评论,它自 VC2005 以来不再有效。

ATL CAtlModule 实现提供了虚拟 CAtlModule::AddCommonRGSReplacements,您可以覆盖它并添加替换以删除硬编码的 RGS 值。

例如,我的典型 ATL 代码如下所示:

class CFooModule : 
    public CAtlDllModuleT<CFooModule>
{
[...]

// CAtlModule
    HRESULT AddCommonRGSReplacements(IRegistrarBase* pRegistrar)
    {
        // Error handling omitted for code brevity
        __super::AddCommonRGSReplacements(pRegistrar);
        ATLASSERT(m_libid != GUID_NULL);
        pRegistrar->AddReplacement(L"LIBID", _PersistHelper::StringFromIdentifier(m_libid));
        pRegistrar->AddReplacement(L"FILENAME", CStringW(PathFindFileName(GetModulePath())));
        pRegistrar->AddReplacement(L"DESCRIPTION", CStringW(AtlLoadString(IDS_PROJNAME)));
        return S_OK;
    }

在 COM 类 中,我重写 UpdateRegistry 方法以使用标准调用的第三个参数添加标记 _pAtlModule->UpdateRegistryFromResource

因此,许多 .RGS 在 COM 类 之间共享,因为硬编码值已替换为标记。具体来说,RGS 文件中没有 GUID,例如:

HKCR
{
    NoRemove CLSID
    {
        ForceRemove %CLSID% = s '%DESCRIPTION%'
        {
            InprocServer32 = s '%MODULE%'
            {
                val ThreadingModel = s 'Both'
            }
            val AppID = s '%APPID%'
            TypeLib = s '%LIBID%'
        }
    }
}

我无法理解 %CLSID% 是如何被 roman-r 的回答中的 COM class CLSID 替换的。答案好像少了点什么

CodeProject 的替代解决方案:Registry Map for RGS files。 此解决方案引入了自定义 registrymap.hpp header 和 DECLARE_REGISTRY_RESOURCEID_EX 扩展,允许您将 RGS 替换宏添加到您的 COM classes。示例:

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()