2017-03-18 42 views
1

.rgs filesにIDLの変更を反映するためのツールがありますか?IDLファイルの変更を反映するために.rgsファイルをプログラムによって更新する方法

rgsファイルはATLコントロールウィザーズによって作成されますが、そのファイルを更新する方法が見つかりません。

インターフェイスのuuid(.IDLファイル内)を変更すると、それらの.rgsファイルの "ハードコピー"値を手動で変更することが強制されます。これはエラーが発生しやすいです。

私はthis interesting projectこのギャップを埋めるつもりですが、それに応じて最後のコメントは、それ以来VC2005は動作しませんでした。

答えて

1

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

私はroman-rの答えでCOMクラスのCLSIDに置き換えているか%CLSID%理解できないよ。:例えば、RGSファイルにはGUIDがありません。答えには何かがないようです。

CodeProjectの代替ソリューション:Registry Map for RGS files このソリューションでは、DECLARE_REGISTRY_RESOURCEID_EXという拡張子を持つカスタムのregistrymap.hppヘッダーが導入されています。これにより、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() 
関連する問題