2017-03-18 1 views
1

.rgs files을 업데이트하여 IDL의 변경 사항을 반영하는 도구가 있습니까?IDL 파일의 변경 내용을 반영하도록 프로그래밍 방식으로 .rgs 파일을 업데이트하는 방법은 무엇입니까?

rgs 파일은 ATL 컨트롤 위저드에 의해 만들어 지지만 파일을 새로 고치는 방법을 찾을 수 없습니다.

.IDL 파일 내에서 인터페이스의 uuid를 변경하면 .rgs 파일의 "하드 카피"값을 수동으로 변경해야합니다. 이 오류는 조용한 경향이 있습니다.

이 차이를 채우기 위해 의도 된 this interesting project이 발견되었으므로 마지막 의견은 VC2005 이후로는 더 이상 작동하지 않습니다.

답변

1

ATL CAtlModule 구현에서는 가상화 된 RGS 값을 제거하고 대체 할 수있는 가상 CAtlModule::AddCommonRGSReplacements을 제공합니다. 예를 들어

, 내 전형적인 ATL 코드는 다음과 같습니다 : 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; 
    } 

내가 표준 전화 _pAtlModule->UpdateRegistryFromResource의 세 번째 매개 변수로 토큰을 추가 UpdateRegistry 메소드를 오버라이드 (override).

따라서 하드 코딩 된 값이 토큰으로 바뀌기 때문에 많은 .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. 이 솔루션은 COM 클래스에 RGS 대체 매크로를 추가 할 수있는 DECLARE_REGISTRY_RESOURCEID_EX 확장명의 사용자 정의 registrymap.hpp 헤더를 도입합니다. 예 :

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() 
관련 문제