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