Quelle est la syntaxe de la définition des types complexes ?
Le suivi d’événements pour Windows (ETW) définit plusieurs types simples et complexes à utiliser dans les fonctions de suivi. Ces types sont déclarés dans le fichier Defaultwpp.ini. Toutefois, vous pouvez créer votre propre fichier de configuration personnalisé et demander à WPP de l’utiliser.
Le format du type de données complexe, DEFINE_CPLX_TYPE, est le suivant :
DEFINE_CPLX_TYPE(TypeName, HelperMacroName, ArgumentType, WppMofType,"WppMofFormat", TypeSignature, Priority, Slots);
Par exemple :
DEFINE_CPLX_TYPE(.*ls, WPP_LOGXWCS, const xwcs_t&, ItemPWString,"s", _xwcs_t_, 0, 2);
Éléments de format
Typename
WPP utilise ce champ pour identifier le type complexe. Par exemple, .*ls.
HelperMacroName
Macro d’assistance qui convertit un argument en tableau de longueur variable au format d’une paire longueur/adresse. Ce format est requis par la fonction TraceMessage pour chacune des entrées de sa liste d’arguments variables.
Pour mettre en forme correctement l’argument, vous devez utiliser la macro WPP_LOGPAIR dans la définition de la macro d’assistance, comme illustré dans l’exemple suivant :
#define HelperMacroName(x) WPP_LOGPAIR(length, x)
Note Selon la logique de suivi que vous souhaitez implémenter, vous devrez peut-être définir la macro à l’aide de plusieurs macros WPP_LOGPAIR.
Type d’argument
Indique la valeur que les arguments de type TypeName peuvent accepter. Par exemple, const xwcs_t&.
WppMofType
Spécifie un type MOF (Managed Object Format) reconnu par le préprocesseur WPP
WppMofFormat
Spécifie un spécificateur de format, tel que « s », reconnu par le préprocesseur WPP.
TypeSignature
Chaîne ajoutée au nom de la fonction pour l’associer au type complexe. Il doit y avoir un seul caractère ou plusieurs caractères entre les traits de soulignement. Par exemple, _xwcs_t_.
Priorité
Cet élément est réservé et doit être défini sur zéro.
Slots
Spécifie le nombre maximal de paramètres de longueur variable que le préprocesseur WPP transmet à la fonction TraceMessage pour ce type complexe. Cet élément de format est facultatif. WPP utilise une valeur par défaut de 1 si cet élément n’est pas spécifié.
Exemple
Pour définir un type complexe, procédez comme suit :
Créez un fichier de configuration local. Ce fichier doit contenir la macro DEFINE_CPLX_TYPE qui définit le type complexe.
Spécifiez le fichier de configuration local dans le préprocesseur WPP. Ouvrez les propriétés du projet. Sous Suivi WPP, Options de fichier, utilisez le champ Fichier de configuration supplémentaire pour spécifier le nom du fichier de configuration (paramètre-ini ). Veillez à activer le suivi WPP en définissant Exécuter WPP sur Oui. Pour plus d’informations, consultez Préprocesseur WPP.
Par exemple, vous pouvez créer un fichier de configuration local (Localwpp.ini) qui définit un type complexe nommé .*ls. Vous définissez le type complexe de la manière suivante :
DEFINE_CPLX_TYPE(.*ls, WPP_LOGXWCS, const xwcs_t&, ItemPWString,"s", _xwcs_t_, 0, 2);
Ensuite, quand WPP voit un type .*ls, comme dans :
printf("my string is %.*ls", value);
WPP génère la fonction de préproduction suivante (où SF représente « fonction intermédiaire ») :
WPP_SF__xwcs_t_(..., const xwcs_t& a1) {
TraceMessage(..., WPP_LOGXWCS(a1) 0);
}
WPP génère ensuite une entrée MOF, comme dans la chaîne suivante, où le nom de type .*ls est remplacé par le format MOF approprié, %s.
"my string is %s"
{
Value, ItemPWString
}
Il génère également une structure pour le type, telle que
struct xwcs_t {
WCHAR* _buf;
short _len;
xwcs_t(short buf, short len):_buf(buf),_len(len){}
};
À présent, ajoutez une macro pour combiner les types de données dans une chaîne de type xwstr_t, comme suit :
#define WPP_LOGXWCS(x) WPP_LOGPAIR(2, &(x)._len) WPP_LOGPAIR((x)._len, (x)._buf)
où ItemPWString est un type de chaîne Unicode compté reconnu par WPP. La longueur est spécifiée sous la forme de 2 octets.
Quand ETW interprète la définition WPP_LOGXWCS, il place une chaîne de 2 octets dans une mémoire tampon la première WPP_LOGPAIR macro est interprétée. ETW copie ensuite tous les octets de la chaîne dans une mémoire tampon quand ETW interprète la deuxième macro WPP_LOGPAIR,
Étant donné que vous avez spécifié la longueur distincte des données, WPP_LOGXWCS consomme deux emplacements de TraceMessage. Par conséquent, le nombre 2 est le huitième argument.
Lorsque vous appelez le préprocesseur WPP, utilisez l’option Ignorer les points d’exclamation (-noshrieks). Cela permet à WPP de reconnaître un type complexe qui a un nom qui n’est pas placé dans des points d’exclamation ( !), également appelés « cris ».
Pour obtenir la liste complète des options de suivi WPP et des informations sur la façon de les définir à partir de la page de propriétés du projet, consultez Préprocesseur WPP.