首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何以编程方式更新.rgs文件以反映IDL文件中所做的更改?

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

Stack Overflow用户
提问于 2017-03-18 17:51:21
回答 2查看 793关注 0票数 1

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

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

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

我发现这个有趣的项目想要填补这一空白,但相应地,最后的评论是,自从VC2005之后,它就不再起作用了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-18 18:46:30

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

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

代码语言:javascript
复制
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,例如:

代码语言:javascript
复制
HKCR
{
    NoRemove CLSID
    {
        ForceRemove %CLSID% = s '%DESCRIPTION%'
        {
            InprocServer32 = s '%MODULE%'
            {
                val ThreadingModel = s 'Both'
            }
            val AppID = s '%APPID%'
            TypeLib = s '%LIBID%'
        }
    }
}
票数 3
EN

Stack Overflow用户

发布于 2018-02-13 12:50:44

我无法理解%CLSID%是如何被罗曼-r的答案中的COM类CLSID所取代的,答案中似乎缺少了什么。

CodeProject的替代解决方案:RGS文件的注册表映射。此解决方案引入了带有registrymap.hpp扩展的自定义DECLARE_REGISTRY_RESOURCEID_EX头,允许您将RGS替换宏添加到COM类中。示例:

代码语言:javascript
复制
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()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42877827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档