ATL CAtlModule
実装では、仮想化されたRGS値を無効にして置き換えることで、ハードコードされたRGS値を削除できる仮想CAtlModule::AddCommonRGSReplacements
を提供しています。私は標準のコール_pAtlModule->UpdateRegistryFromResource
の三番目のパラメータを持つトークンを追加するUpdateRegistry
メソッドをオーバーライドCOMクラスで
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コードは次のようになります。
結果、ハードコードされた値がトークンに置き換えられるため、多くの.RGSがCOMクラス間で共有されます。具体的には、
HKCR
{
NoRemove CLSID
{
ForceRemove %CLSID% = s '%DESCRIPTION%'
{
InprocServer32 = s '%MODULE%'
{
val ThreadingModel = s 'Both'
}
val AppID = s '%APPID%'
TypeLib = s '%LIBID%'
}
}
}