Kepatuhan KETAT
Beberapa kode sumber yang berhasil dikompilasi mungkin menghasilkan pesan kesalahan saat Anda mengaktifkan pemeriksaan jenis STRICT . Bagian berikut menjelaskan persyaratan minimal untuk membuat kode Anda dikompilasi saat STRICT diaktifkan. Langkah tambahan direkomendasikan, terutama untuk menghasilkan kode portabel.
Persyaratan umum
Persyaratan utama adalah Anda harus mendeklarasikan jenis handel dan penunjuk fungsi yang benar alih-alih mengandalkan jenis yang lebih umum. Anda tidak dapat menggunakan satu tipe handel di mana yang lain diharapkan. Ini juga berarti bahwa Anda mungkin harus mengubah deklarasi fungsi dan menggunakan lebih banyak jenis cast.
Untuk hasil terbaik, jenis HANDLE generik harus digunakan hanya jika perlu.
Mendeklarasikan Fungsi Dalam Aplikasi Anda
Pastikan semua fungsi aplikasi dideklarasikan. Menempatkan semua deklarasi fungsi dalam file include direkomendasikan karena Anda dapat dengan mudah memindai deklarasi Anda dan mencari parameter dan jenis pengembalian yang harus diubah.
Jika Anda menggunakan opsi kompilator /Zg untuk membuat file header untuk fungsi Anda, ingatlah bahwa Anda akan mendapatkan hasil yang berbeda tergantung pada apakah Anda telah mengaktifkan pemeriksaan jenis STRICT . Dengan STRICT dinonaktifkan, semua jenis handel menghasilkan jenis dasar yang sama. Dengan STRICT diaktifkan, mereka menghasilkan jenis dasar yang berbeda. Untuk menghindari konflik, Anda perlu membuat ulang file header setiap kali Anda mengaktifkan atau menonaktifkan STRICT, atau mengedit file header untuk menggunakan jenis HWND, HDC, HANDLE, dan sebagainya, alih-alih jenis dasar.
Setiap deklarasi fungsi yang Anda salin dari Windows.h ke dalam kode sumber Anda mungkin telah berubah, dan deklarasi lokal Anda mungkin kedaluarsa. Hapus deklarasi lokal Anda.
Jenis yang Memerlukan Cast
Beberapa fungsi memiliki jenis atau parameter pengembalian generik. Misalnya, fungsi SendMessage mengembalikan data yang mungkin sejumlah jenis, tergantung pada konteksnya. Saat Anda melihat salah satu fungsi ini dalam kode sumber Anda, pastikan Anda menggunakan jenis yang benar yang ditransmisikan dan sespeskal mungkin. Daftar berikut adalah contoh fungsi-fungsi ini.
Saat Anda memanggil SendMessage, DefWindowProc, atau SendDlgItemMessage, Anda harus terlebih dahulu mentransmisikan hasilnya ke jenis UINT_PTR. Anda perlu mengambil langkah serupa untuk fungsi apa pun yang mengembalikan nilai LRESULT atau LONG_PTR , di mana hasilnya berisi handel. Ini diperlukan untuk menulis kode portabel karena ukuran handel bervariasi, tergantung pada versi Windows. Transmisi (UINT_PTR) memastikan konversi yang tepat. Kode berikut menunjukkan contoh di mana SendMessage mengembalikan handel ke kuas:
HBRUSH hbr;
hbr = (HBRUSH)(UINT_PTR)SendMessage(hwnd, WM_CTLCOLOR, ..., ...);
Parameter CreateWindow dan CreateWindowExhmenu terkadang digunakan untuk meneruskan pengidentifikasi kontrol bilangan bulat (ID). Dalam hal ini, Anda harus mentransmisikan ID ke jenis HMENU :
HWND hwnd;
int id;
hwnd = CreateWindow(
TEXT("Button"), TEXT("OK"), BS_PUSHBUTTON,
x, y, cx, cy, hwndParent,
(HMENU)id, // Cast required here
hinst,
NULL);
Pertimbangan Tambahan
Untuk mendapatkan manfaat maksimal dari pemeriksaan jenis STRICT , ada panduan tambahan yang harus Anda ikuti. Kode Anda akan lebih portabel di versi Windows mendatang jika Anda membuat perubahan berikut.
Jenis WPARAM, LPARAM, LRESULT, dan LPVOID adalah jenis data polimorfik. Mereka menyimpan berbagai jenis data pada waktu yang berbeda, bahkan ketika pemeriksaan jenis STRICT diaktifkan. Untuk mendapatkan manfaat pemeriksaan jenis, Anda harus melemparkan nilai dari jenis ini sesegera mungkin. (Perhatikan bahwa kerupuk pesan secara otomatis memprakirakan ulang wParam dan lParam untuk Anda dengan cara portabel.)
Berhati-hatilah untuk membedakan jenis HMODULE dan HINSTANCE . Bahkan dengan STRICT diaktifkan, mereka didefinisikan sebagai jenis dasar yang sama. Sebagian besar fungsi manajemen modul kernel menggunakan jenis HINSTANCE , tetapi ada beberapa fungsi yang mengembalikan atau hanya menerima jenis HMODULE .
Topik terkait