Anotasi Header
[Topik ini menjelaskan anotasi yang didukung di header Windows melalui Windows 7. Jika Anda mengembangkan untuk Windows 8, Anda harus menggunakan anotasi yang dijelaskan dalam Anotasi SAL.]
Anotasi header menjelaskan bagaimana fungsi menggunakan parameternya dan mengembalikan nilai. Anotasi ini telah ditambahkan ke banyak file header Windows untuk membantu Anda memastikan bahwa Anda memanggil Windows API dengan benar. Jika Anda mengaktifkan analisis kode, yang tersedia dimulai dengan Visual Studio 2005, pengompilasi akan menghasilkan peringatan tingkat 6000 jika Anda tidak memanggil fungsi ini per penggunaan yang dijelaskan melalui anotasi. Anda juga dapat menambahkan anotasi ini dalam kode Anda sendiri untuk memastikan bahwa anotasi tersebut dipanggil dengan benar. Untuk mengaktifkan analisis kode di Visual Studio, lihat dokumentasi untuk versi Visual Studio Anda.
Anotasi ini didefinisikan dalam Specstrings.h. Mereka dibangun di atas primitif yang merupakan bagian dari Bahasa Anotasi Standar (SAL) dan diimplementasikan menggunakan _declspec("SAL_*")
.
Ada dua kelas anotasi: anotasi buffer dan anotasi lanjutan.
Anotasi Buffer
Anotasi buffer menjelaskan bagaimana fungsi menggunakan pointer mereka dan dapat digunakan untuk mendeteksi overrun buffer. Setiap parameter dapat menggunakan nol atau satu anotasi buffer. Anotasi buffer dibangun dengan garis bawah terkemuka dan komponen yang dijelaskan di bagian berikut.
Ukuran buffer | Deskripsi |
---|---|
(ukuran) |
Menentukan ukuran total buffer. Gunakan dengan _bcount dan _ecount; jangan gunakan dengan _part. Nilai ini adalah ruang yang dapat diakses; mungkin kurang dari ruang yang dialokasikan. |
(ukuran, panjang) |
Menentukan ukuran total dan panjang penyangga yang diinisialisasi. Gunakan dengan _bcount_part dan _ecount_part. Ukuran total mungkin kurang dari ruang yang dialokasikan. |
Unit ukuran buffer | Deskripsi |
---|---|
_bcount |
Ukuran buffer dalam byte. |
_ecount |
Ukuran buffer ada dalam elemen. |
Petunjuk | Deskripsi |
---|---|
_In |
Fungsi ini berbunyi dari buffer. Pemanggil menyediakan buffer dan menginisialisasinya. |
_Inout |
Fungsi ini membaca dari dan menulis ke buffer. Pemanggil menyediakan buffer dan menginisialisasinya. Jika digunakan dengan _deref, buffer dapat dialokasikan kembali oleh fungsi . |
_Out ekspres |
Fungsi menulis ke buffer. Jika digunakan pada nilai pengembalian atau dengan _deref, fungsi menyediakan buffer dan menginisialisasinya. Jika tidak, pemanggil menyediakan buffer dan fungsi menginisialisasinya. |
Tidak langsung | Deskripsi |
---|---|
_deref |
Dereferensi parameter untuk mendapatkan penunjuk buffer. Parameter ini mungkin bukan NULL. |
_deref_opt |
Dereferensi parameter untuk mendapatkan penunjuk buffer. Parameter ini bisa NULL. |
Inisialisasi | Deskripsi |
---|---|
_Penuh |
Fungsi ini menginisialisasi seluruh buffer. Gunakan hanya dengan buffer output. |
_Bagian |
Fungsi ini menginisialisasi bagian dari buffer, dan secara eksplisit menunjukkan berapa banyak. Gunakan hanya dengan buffer output. |
Buffer yang diperlukan atau opsional | Deskripsi |
---|---|
_Memilih |
Parameter ini bisa NULL. |
Contoh berikut menunjukkan anotasi untuk fungsi GetModuleFileName . Parameter hModule adalah parameter input opsional . Parameter lpFilename adalah parameter output; ukurannya dalam karakter ditentukan oleh parameter nSize dan panjangnya mencakup karakter null-terminating. Parameter nSize adalah parameter input.
DWORD
WINAPI
GetModuleFileName(
__in_opt HMODULE hModule,
__out_ecount_part(nSize, return + 1) LPTSTR lpFilename,
__in DWORD nSize
);
Berikut ini adalah anotasi yang ditentukan dalam Specstrings.h. Gunakan informasi dalam tabel di atas untuk menginterpretasikan maknanya.
__bcount(ukuran)
__bcount_opt(ukuran)
__deref_bcount(ukuran)
__deref_bcount_opt(ukuran)
__deref_ecount(ukuran)
__deref_ecount_opt(ukuran)
__deref_in
__deref_in_bcount(ukuran)
__deref_in_bcount_opt(ukuran)
__deref_in_ecount(ukuran)
__deref_in_ecount_opt(ukuran)
__deref_in_opt
__deref_inout
__deref_inout_bcount(ukuran)
__deref_inout_bcount_full(ukuran)
__deref_inout_bcount_full_opt(ukuran)
__deref_inout_bcount_opt(ukuran)
__deref_inout_bcount_part(ukuran,panjang)
__deref_inout_bcount_part_opt(ukuran,panjang)
__deref_inout_ecount(ukuran)
__deref_inout_ecount_full(ukuran)
__deref_inout_ecount_full_opt(ukuran)
__deref_inout_ecount_opt(ukuran)
__deref_inout_ecount_part(ukuran,panjang)
__deref_inout_ecount_part_opt(ukuran,panjang)
__deref_inout_opt
__deref_opt_bcount(ukuran)
__deref_opt_bcount_opt(ukuran)
__deref_opt_ecount(ukuran)
__deref_opt_ecount_opt(ukuran)
__deref_opt_in
__deref_opt_in_bcount(ukuran)
__deref_opt_in_bcount_opt(ukuran)
__deref_opt_in_ecount(ukuran)
__deref_opt_in_ecount_opt(ukuran)
__deref_opt_in_opt
__deref_opt_inout
__deref_opt_inout_bcount(ukuran)
__deref_opt_inout_bcount_full(ukuran)
__deref_opt_inout_bcount_full_opt(ukuran)
__deref_opt_inout_bcount_opt(ukuran)
__deref_opt_inout_bcount_part(ukuran,panjang)
__deref_opt_inout_bcount_part_opt(ukuran,panjang)
__deref_opt_inout_ecount(ukuran)
__deref_opt_inout_ecount_full(ukuran)
__deref_opt_inout_ecount_full_opt(ukuran)
__deref_opt_inout_ecount_opt(ukuran)
__deref_opt_inout_ecount_part(ukuran,panjang)
__deref_opt_inout_ecount_part_opt(ukuran,panjang)
__deref_opt_inout_opt
__deref_opt_out
__deref_opt_out_bcount(ukuran)
__deref_opt_out_bcount_full(ukuran)
__deref_opt_out_bcount_full_opt(ukuran)
__deref_opt_out_bcount_opt(ukuran)
__deref_opt_out_bcount_part(ukuran,panjang)
__deref_opt_out_bcount_part_opt(ukuran,panjang)
__deref_opt_out_ecount(ukuran)
__deref_opt_out_ecount_full(ukuran)
__deref_opt_out_ecount_full_opt(ukuran)
__deref_opt_out_ecount_opt(ukuran)
__deref_opt_out_ecount_part(ukuran,panjang)
__deref_opt_out_ecount_part_opt(ukuran,panjang)
__deref_opt_out_opt
__deref_out
__deref_out_bcount(ukuran)
__deref_out_bcount_full(ukuran)
__deref_out_bcount_full_opt(ukuran)
__deref_out_bcount_opt(ukuran)
__deref_out_bcount_part(ukuran,panjang)
__deref_out_bcount_part_opt(ukuran,panjang)
__deref_out_ecount(ukuran)
__deref_out_ecount_full(ukuran)
__deref_out_ecount_full_opt(ukuran)
__deref_out_ecount_opt(ukuran)
__deref_out_ecount_part(ukuran,panjang)
__deref_out_ecount_part_opt(ukuran,panjang)
__deref_out_opt
__ecount(ukuran)
__ecount_opt(ukuran)
__In
__in_bcount(ukuran)
__in_bcount_opt(ukuran)
__in_ecount(ukuran)
__in_ecount_opt(ukuran)
__in_opt
__Inout
__inout_bcount(ukuran)
__inout_bcount_full(ukuran)
__inout_bcount_full_opt(ukuran)
__inout_bcount_opt(ukuran)
__inout_bcount_part(ukuran,panjang)
__inout_bcount_part_opt(ukuran,panjang)
__inout_ecount(ukuran)
__inout_ecount_full(ukuran)
__inout_ecount_full_opt(ukuran)
__inout_ecount_opt(ukuran)
__inout_ecount_part(ukuran,panjang)
__inout_ecount_part_opt(ukuran,panjang)
__inout_opt
__Out ekspres
__out_bcount(ukuran)
__out_bcount_full(ukuran)
__out_bcount_full_opt(ukuran)
__out_bcount_opt(ukuran)
__out_bcount_part(ukuran,panjang)
__out_bcount_part_opt(ukuran,panjang)
__out_ecount(ukuran)
__out_ecount_full(ukuran)
__out_ecount_full_opt(ukuran)
__out_ecount_opt(ukuran)
__out_ecount_part(ukuran,panjang)
__out_ecount_part_opt(ukuran,panjang)
__out_opt
Anotasi Tingkat Lanjut
Anotasi tingkat lanjut memberikan informasi tambahan tentang parameter atau nilai yang dikembalikan. Setiap parameter atau nilai yang dikembalikan dapat menggunakan nol atau satu anotasi tingkat lanjut.
Anotasi | Deskripsi |
---|---|
__blocksOn(sumber daya) |
Fungsi memblokir sumber daya yang ditentukan. |
__Callback |
Fungsi ini dapat digunakan sebagai penunjuk fungsi. |
__checkReturn |
Penelepon harus memeriksa nilai yang dikembalikan. |
__format_string |
Parameter adalah string yang berisi penanda % gaya printf. |
__in_awcount(expr,size) |
Jika ekspresi benar saat keluar, ukuran buffer input ditentukan dalam byte. Jika ekspresi salah, ukuran ditentukan dalam elemen. |
__nullnullterminated |
Buffer dapat diakses hingga dan termasuk urutan pertama dari dua karakter null atau pointer. |
__nullterminated |
Buffer dapat diakses hingga dan termasuk karakter atau penunjuk null pertama. |
__out_awcount(expr,size) |
Jika ekspresi benar saat keluar, ukuran buffer output ditentukan dalam byte. Jika ekspresi salah, ukuran ditentukan dalam elemen. |
__Menimpa |
Menentukan perilaku penimpaan C#-style untuk metode virtual. |
__Dipesan |
Parameter dicadangkan untuk digunakan di masa mendatang dan harus nol atau NULL. |
__success(expr) |
Jika ekspresi benar saat keluar, pemanggil dapat mengandalkan semua jaminan yang ditentukan oleh anotasi lain. Jika ekspresi salah, penelepon tidak dapat mengandalkan jaminan. Anotasi ini secara otomatis ditambahkan ke fungsi yang mengembalikan nilai HRESULT . |
__typefix(ctype) |
Perlakukan parameter sebagai jenis yang ditentukan daripada jenis yang dinyatakan. |
Contoh berikut menunjukkan buffer dan anotasi tingkat lanjut untuk fungsi DeleteTimerQueueTimer, FreeEnvironmentStrings, dan UnhandledExceptionFilter .
__checkReturn
BOOL
WINAPI
DeleteTimerQueueTimer(
__in_opt HANDLE TimerQueue,
__in HANDLE Timer,
__in_opt HANDLE CompletionEvent
);
BOOL
WINAPI
FreeEnvironmentStrings(
__in __nullnullterminated LPTCH
);
__callback
LONG
WINAPI
UnhandledExceptionFilter(
__in struct _EXCEPTION_POINTERS *ExceptionInfo
);