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

问题描述 投票:0回答:2

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

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

当我们更改接口的 uuid(在 .IDL 文件内)时,我们被迫手动更改这些 .rgs 文件中的“硬拷贝”值。这很容易出错。

我发现这个有趣的项目打算填补这个空白,但是根据最后的评论,它自 VC2005 以来就不再起作用了。

visual-c++ com atl
2个回答
4
投票

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%'
        }
    }
}

1
投票

我无法理解

%CLSID%
如何在roman-r的答案中替换为COM类CLSID。答案好像少了点什么。

CodeProject 的替代解决方案:RGS 文件的注册表映射。 此解决方案引入了带有

registrymap.hpp
扩展的自定义
DECLARE_REGISTRY_RESOURCEID_EX
标头,允许您将 RGS 替换宏添加到 COM 类。示例:

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()
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.