Verwenden von austauschbare Parametern (der Präprozessor des Registrators)

Ersetzbare Parameter ermöglichen eines Rechtspflegers Client Run-Time-Daten angeben. Hierzu unterhält der Kanzler eine Ersatz-Karte, in die es die ersetzbare Parameter in Ihrem Skript zugeordneten Werte eingibt. Der Kanzler macht diese Einträge zur Laufzeit. Der folgende Abschnitt veranschaulicht diese Schritte.

Mithilfe von %Module%

Den Assistenten für ATL-Objekte automatisch generiert eine Skript, das verwendet %MODULE% . ATL verwendet diese ersetzbaren Parameter für den tatsächlichen Speicherort der DLL oder exe-Datei des Servers.

Neben dem Hinzufügen von %MODULE% an das Skript fügt den Assistenten für ATL-Objekte auch die folgende Zeile des Objekts Klassendeklaration:

DECLARE_REGISTRY_RESOURCEID(IDR_MYCOMAPP)

Dieses Makro wird erweitert, um:

statische HRESULT WI&NAPI UpdateRegistry(BOOL bRegister)
{
 Nbsp; Rückkehr _Module.UpdateRegistryFromResource (IDR_MYCOMAPP, bRegistrieren Sie sich);
}

wo _Module bezieht sich auf die globalen CComModule, hat die folgende Methode und # define -Anweisung:

UpdateRegistryFromResource (UI&NT nResID, BOOL bRegistrieren Sie sich,
 Nbsp;     Struct _ATL_REGMAP_ENTRY * pMapEntries = NULL);

# define UpdateRegistryFromResource UpdateRegistryFromResource

Diese Methode ruft AtlModuleUpdateRegistryFromResource , die enthält den folgenden Code:

ATLAPI AtlModuleUpdateRegistryFromResource(_ATL_MODULE*pM, nbsp;        LPCOLESTR LpszRes, BOOL bRegistrieren Sie sich, Struct _ATL_REGMAP_ENTRY * pMapEntries, IRegistrar * pReg)
{
   DAS USES_CONVERSION;
   ...
   CComPtr <IRegistrar> p;
   ...

TCHAR SzModule [_MAX_PATH];
   GetModuleFileName (pM - > M_hInst, SzModule, _MAX_PATH);
   p - > AddReplacement(OLESTR("Module"), T2OLE(szModule));

...
}

Hinweis&Nbsp;  Diesen Code finden Sie im atl\include\atlimpl.cpp.

CoCreateInstance erwirbt den Zeiger p , welche Punkte an den Kanzler. AddReplacement erhält dann eine LPCOLESTR , die die Zeichenfolge " Module ", sowie eine LPCOLESTR , die die Zeichenfolge erworben von der Win32-API-Funktion, GetModuleFileName. Dieser Code fügt einen Zuordnungseintrag Ersatz für die Module Variable, die einen Wert das Ergebnis von GetModuleFileNamezugeordnet hat. Nun, wenn der Präprozessor sieht die %MODULE% im Skript, ersetzen sie es durch den Wert von GetModuleFileName.

Verketten von Laufzeitdaten mit Skriptdaten

Eine andere Verwendung des Präprozessors ist zum Verketten von Laufzeitdaten mit Skriptdaten. Angenommen, wir brauchen einen Eintrag, der enthält einen vollständigen Pfad zu einem Modul mit der Zeichenfolge " , 1 " am Ende angehängt. Zunächst definieren Sie die folgende expansion:

'MyGoofyKey' = s '% Modul % 1'

Dann, vor dem Aufruf des Skriptes Verarbeitungsmethoden, fügen Sie Ersatz zur Karte hinzu:

TCHAR SzModule [_MAX_PATH]
GetModuleFileName (pM-Gt; M_hInst, SzModule, _MAX_PATH);
p - > AddReplacement(OLESTR("Module"), T2OLE(szModule))

Während der Analyse des Skripts, der Registrar erweitert '%MODULE%, 1' umc:\mycode\mydll.dll, 1.

Hinweis&Nbsp;  In einem Registratorskript ist 4 K die maximale Tokengröße. (Ein Token ist ein erkennbares Element in die Syntax.) Dazu gehören Token, die erstellt oder erweitert durch den Präprozessor wurden.

Hinweis&Nbsp;  Wiederbeschaffungswerte zur Laufzeit zu ersetzen, entfernen Sie den Aufruf von DECLARE_REGISTRY_RESOURCE oder DECLARE_REGISTRY_RESOURCEID -Makro. Stattdessen ersetzen Sie ihn durch eigene UpdateRegistry -Memberfunktion, die CComModule::UpdateRegistryFromResourceaufruft, und übergeben Sie das Array von _ATL_REGMAP_ENTRY Strukturen. Ihr _ATL_REGMAP_ENTRY -Array muss mindestens einen Eintrag, der auf {NULL,NULL} festgelegt ist, und dieser Eintrag sollte immer der letzte Eintrag sein. Andernfalls wird eine Zugriffsverletzung generiert werden, wenn UpdateRegistryFromResrouce aufgerufen wird.

Index