发布于 2017-03-18 18:46:30
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%'
}
}
}发布于 2018-02-13 12:50:44
我无法理解%CLSID%是如何被罗曼-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()https://stackoverflow.com/questions/42877827
复制相似问题