STRICT 型チェックを有効にすると、正常にコンパイルされるソース コード エラー メッセージが生成される場合があります。 以降のセクションでは、STRICT が有効な場合にコード コンパイルするための最小要件について説明します。 移植可能なコードを生成するには、特に追加の手順をお勧めします。
一般的な要件
主な要件は、より一般的な型に依存するのではなく、正しいハンドル型と関数ポインターを宣言する必要があるということです。 1 つのハンドル型を別のハンドルの型を使用することはできません。 これは、関数宣言を変更し、より多くの型キャストを使用する必要がある場合もあることを意味します。
最良の結果を得るには、汎用 HANDLE 型は、必要な場合にのみ使用する必要があります。
アプリケーション内での関数の宣言
すべてのアプリケーション関数が宣言されていることを確認します。 すべての関数宣言をインクルード ファイルに配置することをお勧めします。宣言を簡単にスキャンし、変更する必要があるパラメーターと戻り値の型を探すことができるためです。
/Zg コンパイラ オプションを使用して関数のヘッダー ファイルを作成する場合は、STRICT 型チェック 有効にしているかどうかによって異なる結果が得られる点に注意してください。 STRICT を無効にすると、すべてのハンドル型で同じ基本型が生成されます。 STRICT を有効にすると、異なる基本型が生成されます。 競合を回避するには、STRICTを有効または無効にするたびにヘッダー ファイルを再作成するか、基本型ではなく、HWND 、HDC、HANDLEなどの型を使用するようにヘッダー ファイルを編集する必要があります。
Windows.h からソース コードにコピーした関数宣言が変更され、ローカル宣言が古くなっている可能性があります。 ローカル宣言を削除します。
キャストが必要な型
一部の関数には、ジェネリック戻り値の型またはパラメーターがあります。 たとえば、SendMessage 関数は、コンテキストに応じて任意の数の型のデータを返します。 ソース コードにこれらの関数のいずれかが表示されたら、正しい型キャストを使用し、可能な限り具体的であることを確認してください。 これらの関数の例を次に示します。
- LocalLock
- GlobalLock
- GetWindowLongの
- SetWindowLongの
- SendMessageの
- DefWindowProcの
- SendDlgItemMessage
SendMessage、DefWindowProc、または SendDlgItemMessageを呼び出す場合は、最初に結果を UINT_PTR型にキャストする必要があります。 LRESULT または LONG_PTR 値を返す関数でも同様の手順を実行する必要があります。この場合、結果にはハンドルが含まれます。 これは、Windows のバージョンによってハンドルのサイズが異なるため、移植可能なコードを記述するために必要です。 (UINT_PTR) キャストにより、適切な変換が保証されます。 次のコードは、SendMessage がブラシにハンドルを返す例を示しています。
HBRUSH hbr;
hbr = (HBRUSH)(UINT_PTR)SendMessage(hwnd, WM_CTLCOLOR, ..., ...);
CreateWindow と CreateWindowEx パラメーター は、整数制御識別子 (ID) を渡すために使用される場合があります。 この場合、ID を 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);
その他の考慮事項
STRICT 型チェック 最大限のメリットを得るには、追加のガイドラインに従う必要があります。 次の変更を行うと、将来のバージョンの Windows でコードの移植性が高くなります。
WPARAM 、LPARAM、LRESULT、および LPVOID型は、ポリモーフィックなデータ型 。 STRICT 型チェックが有効になっている場合でも、さまざまな種類のデータ 保持されます。 型チェックの利点を得るには、できるだけ早くこれらの型の値をキャストする必要があります。 (メッセージ クラッカーは、wParam 自動的に再キャストされ、移植可能な方法で lParam されることに注意してください)。
HMODULE と HINSTANCE 型 区別するには、特別な注意を払います。 STRICT が有効になっている場合でも、それらは同じ基本型として定義されます。 ほとんどのカーネル モジュール管理機能は HINSTANCE 型 使用しますが、HMODULE 型のみを返すか受け入れる関数がいくつかあります。
関連トピック