Apa sintaks definisi jenis kompleks?
Pelacakan Peristiwa untuk Windows (ETW) mendefinisikan beberapa jenis sederhana dan kompleks untuk digunakan dalam fungsi pelacakan. Jenis-jenis ini dideklarasikan dalam file Defaultwpp.ini. Namun, Anda dapat membuat file konfigurasi kustom Anda sendiri dan mengarahkan WPP untuk menggunakannya.
Format jenis data kompleks, DEFINE_CPLX_TYPE, adalah sebagai berikut:
DEFINE_CPLX_TYPE(TypeName, HelperMacroName, ArgumentType, WppMofType,"WppMofFormat", TypeSignature, Priority, Slots);
Contohnya:
DEFINE_CPLX_TYPE(.*ls, WPP_LOGXWCS, const xwcs_t&, ItemPWString,"s", _xwcs_t_, 0, 2);
Format Elemen
TypeName
WPP menggunakan bidang ini untuk mengidentifikasi jenis kompleks. Misalnya, .*ls.
HelperMacroName
Makro pembantu yang mengonversi argumen menjadi array panjang variabel dalam format pasangan panjang/alamat. Format ini diperlukan oleh fungsi TraceMessage untuk setiap entri dalam daftar argumen variabelnya.
Untuk memformat argumen dengan benar, Anda harus menggunakan makro WPP_LOGPAIR dalam definisi makro pembantu, seperti yang diperlihatkan dalam contoh berikut:
#define HelperMacroName(x) WPP_LOGPAIR(length, x)
Catatan Bergantung pada logika pelacakan yang ingin Anda terapkan, Anda mungkin perlu menentukan makro dengan menggunakan beberapa makro WPP_LOGPAIR.
Tipe Argumen
Menunjukkan nilai yang dapat diterima argumen jenis TypeName . Misalnya, const xwcs_t&.
WppMofType
Menentukan jenis Managed Object Format (MOF) yang dikenali oleh preprosektor WPP
WppMofFormat
Menentukan penentu format, seperti "s", yang dikenali oleh pra-prosesor WPP.
TypeSignature
String ditambahkan ke nama fungsi untuk mengaitkannya dengan jenis kompleks. Harus ada satu karakter atau beberapa karakter di antara garis bawah. Misalnya, _xwcs_t_.
Prioritas
Elemen ini dicadangkan dan harus diatur ke nol.
Slot
Menentukan jumlah maksimum parameter panjang variabel yang diteruskan praprosesor WPP ke fungsi TraceMessage untuk jenis kompleks ini. Elemen format ini bersifat opsional. WPP menggunakan nilai default 1 jika elemen ini tidak ditentukan.
Contoh
Untuk menentukan jenis kompleks, lakukan hal berikut:
Membuat file konfigurasi lokal. File ini harus berisi makro DEFINE_CPLX_TYPE yang menentukan tipe kompleks.
Tentukan file konfigurasi lokal ke Preproscessor WPP. Buka properti proyek. Di bawah Pelacakan WPP, Opsi File, gunakan bidang file Konfigurasi Tambahan untuk menentukan nama file konfigurasi (parameter-ini ). Pastikan untuk mengaktifkan pelacakan WPP dengan mengatur Jalankan WPP ke Ya. Lihat Praproscessor WPP untuk informasi selengkapnya.
Misalnya, Anda dapat membuat file konfigurasi lokal (Localwpp.ini) yang menentukan jenis kompleks bernama .*ls. Anda menentukan jenis kompleks dengan cara berikut:
DEFINE_CPLX_TYPE(.*ls, WPP_LOGXWCS, const xwcs_t&, ItemPWString,"s", _xwcs_t_, 0, 2);
Kemudian, ketika WPP melihat jenis .*ls, seperti di:
printf("my string is %.*ls", value);
WPP menghasilkan fungsi penahapan berikut (di mana SF mewakili "fungsi penahapan"):
WPP_SF__xwcs_t_(..., const xwcs_t& a1) {
TraceMessage(..., WPP_LOGXWCS(a1) 0);
}
WPP kemudian menghasilkan entri MOF, seperti dalam string berikut, di mana nama jenis .*ls diganti dengan format MOF yang sesuai, %s.
"my string is %s"
{
Value, ItemPWString
}
Ini juga menghasilkan struktur untuk jenis tersebut, seperti
struct xwcs_t {
WCHAR* _buf;
short _len;
xwcs_t(short buf, short len):_buf(buf),_len(len){}
};
Sekarang, tambahkan makro untuk menggabungkan jenis data ke dalam string jenis xwstr_t, sebagai berikut:
#define WPP_LOGXWCS(x) WPP_LOGPAIR(2, &(x)._len) WPP_LOGPAIR((x)._len, (x)._buf)
di mana ItemPWString adalah jenis string Unicode yang dihitung yang dikenali oleh WPP. Panjangnya ditentukan sebagai 2 byte.
Ketika ETW menginterpretasikan definisi WPP_LOGXWCS, ETW menempatkan string 2-byte ke dalam buffer , makro WPP_LOGPAIR pertama ditafsirkan. ETW kemudian menyalin semua byte string ke dalam buffer ketika ETW menginterpretasikan makro WPP_LOGPAIR kedua,
Karena Anda menentukan panjang yang terpisah dari data, WPP_LOGXWCS menggunakan dua slot TraceMessage. Oleh karena itu, angka 2 adalah argumen kedelapan.
Saat memanggil Praprosem WPP, gunakan opsi Abaikan Tanda Seru (-noshrieks). Ini membantu WPP mengenali jenis kompleks yang memiliki nama yang tidak diapit tanda seru (!), juga dikenal sebagai "jeritan."
Untuk daftar lengkap opsi pelacakan WPP dan informasi tentang cara mengaturnya dari halaman properti proyek, lihat Praproscessor WPP.