Paramètres remplaçables permettent la clientèle du registraire spécifier les données d'exécution. Pour ce faire, le registraire tient à jour une carte de remplacement dans lequel il pénètre dans les valeurs associées à des paramètres remplaçables dans votre script. Le registraire a fait ces entrées au moment de l'exécution. La section suivante montre ces étapes.
L'Assistant objet ATL génère automatiquement un script qui utilise %MODULE%
. ATL utilise ce paramètre remplaçable pour l'emplacement réel de votre serveur DLL ou EXE.
Outre l'ajout de %MODULE%
pour le script de l'Assistant objet ATL ajoute également la ligne suivante à la déclaration de classe de l'objet:
DECLARE_REGISTRY_RESOURCEID(IDR_MYCOMAPP)
Cette macro se développe pour:
statique HRESULT WI&NAPI UpdateRegistry(BOOL bRegister)
{
nbsp ; Return _Module.UpdateRegistryFromResource (IDR_MYCOMAPP, bRegister) ;
}
où _Module
désigne le global CComModule, qui a de la déclaration suivante de la méthode et les # define:
UpdateRegistryFromResource (UI&NT nResID, BOOL bRegister,
nbsp ; struct _ATL_REGMAP_ENTRY * pMapEntries = NULL) ;
# define UpdateRegistryFromResource UpdateRegistryFromResource
Cette méthode appelle AtlModuleUpdateRegistryFromResource
, qui contient le code suivant:
ATLAPI AtlModuleUpdateRegistryFromResource(_ATL_MODULE*pM, nbsp; LPCOLESTR lpszRes, BOOL bRegister, struct _ATL_REGMAP_ENTRY * pMapEntries, IRegistrar * pReg)
{
USES_CONVERSION ;
...
CComPtr <IRegistrar> p ;
...
SzModule TCHAR [_MAX_PATH] ;
GetModuleFileName (H - > m_hInst, szModule, _MAX_PATH) ;
p - > AddReplacement(OLESTR("Module"), T2OLE(szModule)) ;
...
}
&Notenbsp ; Vous trouverez ce code dans atl\include\atlimpl.cpp.
CoCreateInstance acquiert le pointeur p
, qui pointe au registraire. Ensuite, AddReplacement reçoit un LPCOLESTR contenant la chaîne " Module
", ainsi qu'un LPCOLESTR contenant la chaîne a acquise de la fonction API Win32, GetModuleFileName. Ce code ajoute une entrée de la carte de remplacement pour le Module
variable qui a une valeur associée à la suite de GetModuleFileName. Maintenant, quand le préprocesseur voit la %MODULE%
dans le script, il il remplacera par la valeur de GetModuleFileName.
Une autre utilisation du préprocesseur consiste à concaténer des données d'exécution avec les données de scénario. Par exemple, supposons que nous avons besoin d'une entrée qui contient un chemin d'accès complet à un module avec la chaîne « , 1
» annexé à la fin. Définissons tout d'abord l'expansion suivante:
« MyGoofyKey » = s « MODULE %, 1 »
Puis, avant d'appeler un script méthodes de traitement, ajouter un remplacement de la carte:
SzModule TCHAR [_MAX_PATH]
GetModuleFileName (H-gt, m_hInst, szModule, _MAX_PATH) ;
p - > AddReplacement(OLESTR("Module"), T2OLE(szModule))
Au cours de l'analyse du script, le registraire étend '%MODULE%, 1'
dec:\mycode\mydll.dll, 1
.
&Notenbsp ; Dans un script de registraire, 4 K est la taille maximale de jeton. (Un jeton est tout élément reconnaissable dans la syntaxe). Cela comprend les jetons qui ont créé ou développé par le préprocesseur.
&Notenbsp ; Pour remplacer les valeurs de remplacement au moment de l'exécution, supprimez l'appel à la macro DECLARE_REGISTRY_RESOURCE ou DECLARE_REGISTRY_RESOURCEID . Au lieu de cela, remplacer par votre propre fonction de membres UpdateRegistry qui appelle CComModule::UpdateRegistryFromResourceet passez votre tableau de structures _ATL_REGMAP_ENTRY . Votre tableau de _ATL_REGMAP_ENTRY doit avoir au moins une entrée est définie sur {NULL,NULL}, et cette entrée doit toujours être la dernière entrée. Sinon, une erreur de violation d'accès sera généré lorsque UpdateRegistryFromResrouce est appelé.