À l'aide des paramètres remplaçables (le préprocesseur de Registrar)

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'aide du MODULE %

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

_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.

La concaténation de données d'exécution avec les données du script

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é.

Index