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

Visual c++ 如何以编程方式更新.rgs文件以反映IDL文件中所做的更改?,visual-c++,com,atl,Visual C++,Com,Atl,是否有任何工具需要更新以反映IDL中所做的更改 rgs文件是由ATL控件wizzard创建的,但我找不到刷新这些文件的方法 当我们更改接口的uuid(在.IDL文件中)时,我们被迫手动更改那些.rgs文件中的“硬拷贝”值。这很容易出错 我发现这是为了填补这一空白,但是,根据上一条评论,它自VC2005以来就不再有效了。ATLCAtlModule实现提供了虚拟功能,您可以覆盖和添加替换以删除硬编码的RGS值 例如,我的典型ATL代码如下所示: class CFooModule : pub

是否有任何工具需要更新以反映IDL中所做的更改

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

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


我发现这是为了填补这一空白,但是,根据上一条评论,它自VC2005以来就不再有效了。

ATL
CAtlModule
实现提供了虚拟功能,您可以覆盖和添加替换以删除硬编码的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;
    }

ATL
CAtlModule
实现提供了虚拟功能,您可以覆盖并添加替换以删除硬编码的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类CLSID替换
%CLSID%
。答案中似乎遗漏了什么

CodeProject中的替代解决方案:。 此解决方案引入了一个自定义的
registrymap.hpp
头,该头带有一个
DECLARE\u REGISTRY\u RESOURCEID\u 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()

我无法理解如何在的答案中用COM类CLSID替换
%CLSID%
。答案中似乎遗漏了什么

CodeProject中的替代解决方案:。 此解决方案引入了一个自定义的
registrymap.hpp
头,该头带有一个
DECLARE\u REGISTRY\u RESOURCEID\u 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()