Wie lautet die Syntax der Definition komplexer Typen?
Die Ereignisablaufverfolgung für Windows (ETW) definiert mehrere einfache und komplexe Typen für die Verwendung in den Ablaufverfolgungsfunktionen. Diese Typen werden in der datei Defaultwpp.ini deklariert. Sie können jedoch eine eigene benutzerdefinierte Konfigurationsdatei erstellen und WPP anweisen, sie zu verwenden.
Das Format des komplexen Datentyps DEFINE_CPLX_TYPE lautet wie folgt:
DEFINE_CPLX_TYPE(TypeName, HelperMacroName, ArgumentType, WppMofType,"WppMofFormat", TypeSignature, Priority, Slots);
Beispiel:
DEFINE_CPLX_TYPE(.*ls, WPP_LOGXWCS, const xwcs_t&, ItemPWString,"s", _xwcs_t_, 0, 2);
Formatelemente
Typename
WPP verwendet dieses Feld, um den komplexen Typ zu identifizieren. Beispiel: .*ls.
HelperMacroName
Ein Hilfsmakro, das ein Argument in ein Array mit variabler Länge im Format eines Längen-/Adresspaars konvertiert. Dieses Format ist für die TraceMessage-Funktion für jeden Eintrag in der Variablenargumentliste erforderlich.
Um das Argument ordnungsgemäß zu formatieren, müssen Sie das Makro WPP_LOGPAIR in der Definition des Hilfsmakros verwenden, wie im folgenden Beispiel gezeigt:
#define HelperMacroName(x) WPP_LOGPAIR(length, x)
Hinweis Abhängig von der Ablaufverfolgungslogik, die Sie implementieren möchten, müssen Sie das Makro möglicherweise mithilfe mehrerer WPP_LOGPAIR Makros definieren.
Argumenttyp
Gibt den Wert an, den Argumente des TypeName-Typs akzeptieren können. Beispielsweise xwcs_t&const .
WppMofType
Gibt einen MOF-Typ (Managed Object Format) an, der vom WPP-Präprozessor erkannt wird.
WppMofFormat
Gibt einen Formatbezeichner wie "s" an, der vom WPP-Präprozessor erkannt wird.
TypeSignature
Eine an den Funktionsnamen angefügte Zeichenfolge, um sie dem komplexen Typ zuzuordnen. Zwischen Unterstrichen muss ein einzelnes Zeichen oder mehrere Zeichen vorhanden sein. Beispiel : _xwcs_t_.
Priorität
Dieses Element ist reserviert und muss auf 0 (null) festgelegt werden.
Slots
Gibt die maximale Anzahl von Parametern variabler Länge an, die der WPP-Präprozessor für diesen komplexen Typ an die TraceMessage-Funktion übergibt. Dieses Formatelement ist optional. WPP verwendet den Standardwert 1, wenn dieses Element nicht angegeben ist.
Beispiel
Gehen Sie wie folgt vor, um einen komplexen Typ zu definieren:
Erstellen Sie eine lokale Konfigurationsdatei. Diese Datei sollte das DEFINE_CPLX_TYPE Makro enthalten, das den komplexen Typ definiert.
Geben Sie die lokale Konfigurationsdatei für den WPP-Präprozessor an. Öffnen Sie die Projekteigenschaften. Verwenden Sie unter WPP-Ablaufverfolgung, Dateioptionen, das Feld Zusätzliche Konfigurationsdatei , um den Namen der Konfigurationsdatei (Parameter -ini ) anzugeben. Stellen Sie sicher, dass Sie die WPP-Ablaufverfolgung aktivieren, indem Sie WPP ausführen auf Ja festlegen. Weitere Informationen finden Sie unter WPP-Präprozessor.
Sie können beispielsweise eine lokale Konfigurationsdatei (Localwpp.ini) erstellen, die einen komplexen Typ namens .*ls definiert. Sie definieren den komplexen Typ wie folgt:
DEFINE_CPLX_TYPE(.*ls, WPP_LOGXWCS, const xwcs_t&, ItemPWString,"s", _xwcs_t_, 0, 2);
Wenn WPP dann den Typ .*ls sieht, z. B. in:
printf("my string is %.*ls", value);
WPP generiert die folgende Stagingfunktion (wobei SF die "Stagingfunktion" darstellt):
WPP_SF__xwcs_t_(..., const xwcs_t& a1) {
TraceMessage(..., WPP_LOGXWCS(a1) 0);
}
WPP generiert dann einen MOF-Eintrag, z. B. in der folgenden Zeichenfolge, wobei der Name des .*ls-Typs durch das entsprechende MOF-Format , %s, ersetzt wird.
"my string is %s"
{
Value, ItemPWString
}
Außerdem wird eine Struktur für den Typ generiert, z. B.
struct xwcs_t {
WCHAR* _buf;
short _len;
xwcs_t(short buf, short len):_buf(buf),_len(len){}
};
Fügen Sie nun ein Makro hinzu, um die Datentypen wie folgt in einer Zeichenfolge vom Typ xwstr_t zu kombinieren:
#define WPP_LOGXWCS(x) WPP_LOGPAIR(2, &(x)._len) WPP_LOGPAIR((x)._len, (x)._buf)
Dabei ist ItemPWString ein gezählter Unicode-Zeichenfolgentyp, der von WPP erkannt wird. Die Länge wird als 2 Byte angegeben.
Wenn ETW die WPP_LOGXWCS Definition interpretiert, wird eine 2-Byte-Zeichenfolge in einen Puffer eingefügt, WPP_LOGPAIR Makros zuerst interpretiert wird. ETW kopiert dann alle Bytes der Zeichenfolge in einen Puffer, wenn ETW das zweite WPP_LOGPAIR Makro interpretiert.
Da Sie die Länge getrennt von den Daten angegeben haben, verwendet WPP_LOGXWCS zwei Slots von TraceMessage. Daher ist die Zahl 2 das achte Argument.
Verwenden Sie beim Aufrufen des WPP-Präprozessors die Option Ausrufezeichen ignorieren (-noshrieks). Dies hilft WPP, einen komplexen Typ zu erkennen, der einen Namen hat, der nicht in Ausrufezeichen (!) eingeschlossen ist, auch als "Shrieks" bezeichnet.
Eine vollständige Liste der WPP-Ablaufverfolgungsoptionen und Informationen dazu, wie sie auf der Eigenschaftenseite des Projekts festgelegt werden, finden Sie unter WPP-Präprozessor.