2017-03-18 2 views
1

Gibt es ein Tool zum Aktualisieren .rgs files, um Änderungen in der IDL widerzuspiegeln?Wie programmgesteuert aktualisieren Sie .rgs-Dateien, um Änderungen in IDL-Dateien widerzuspiegeln?

RGS-Dateien werden vom ATL-Steuerelement-Assistenten erstellt, aber ich kann keine Möglichkeit finden, diese Dateien zu aktualisieren.

Wenn wir die UUID einer Schnittstelle ändern (innerhalb der .IDL-Datei), werden wir gezwungen, die "Hardcopy" -Werte in diesen .rgs-Dateien von Hand zu ändern. Dies ist sehr anfällig für Fehler.

Ich fand this interesting project, die beabsichtigen, diese Lücke zu füllen, aber, entsprechend den letzten Kommentaren, funktionierte es seit VC2005 nicht mehr.

Antwort

1

ATL CAtlModule Implementierung bietet virtuelle CAtlModule::AddCommonRGSReplacements, die Sie überschreiben und Substitutionen hinzufügen können, um hartcodierte RGS-Werte zu entfernen.

Zum Beispiel meine typische ATL-Code sieht wie folgt aus:

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; 
    } 

In COM-Klassen I UpdateRegistry Methode überschreiben Token _pAtlModule->UpdateRegistryFromResource mit dritten Parameter von Standard-Anruf hinzuzufügen.

Als Ergebnis werden viele .RGS zwischen COM-Klassen geteilt, da hardcoded Werte durch Tokens ersetzt werden. Insbesondere gibt es keine GUIDs in RGS-Dateien, z.B .:

HKCR 
{ 
    NoRemove CLSID 
    { 
     ForceRemove %CLSID% = s '%DESCRIPTION%' 
     { 
      InprocServer32 = s '%MODULE%' 
      { 
       val ThreadingModel = s 'Both' 
      } 
      val AppID = s '%APPID%' 
      TypeLib = s '%LIBID%' 
     } 
    } 
} 
0

ich nicht in der Lage bin zu verstehen, wie %CLSID% mit der COM-Klasse CLSID in roman-r ‚s Antwort ersetzt wird. In der Antwort scheint etwas zu fehlen.

Alternative Lösung von CodeProject: Registry Map for RGS files. Diese Lösung führt einen benutzerdefinierten Header registrymap.hpp mit einer Erweiterung DECLARE_REGISTRY_RESOURCEID_EX ein, mit der Sie RGS-Substitutionsmakros zu Ihren COM-Klassen hinzufügen können. Beispiel:

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() 
Verwandte Themen