STRICT 合規性
當您啟用 STRICT 類型檢查時,某些成功編譯的原始程式碼可能會產生錯誤訊息。 下列各節說明啟用 STRICT 時,讓程式碼編譯的最低需求。 建議執行其他步驟,特別是產生可攜式程式碼。
一般需求
主要需求是您必須宣告正確的控制碼類型和函式指標,而不是依賴較通用的類型。 您無法使用預期另一個控制碼類型。 這也表示您可能必須變更函式宣告,並使用更多類型轉換。
為了獲得最佳結果,只有在需要時才應該使用泛型 HANDLE 類型。
在應用程式中宣告函式
請確定已宣告所有應用程式函式。 建議將所有函式宣告放在 include 檔案中,因為您可以輕鬆地掃描宣告,並尋找應該變更的參數和傳回型別。
如果您使用 /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有時用來傳遞整數控制項識別碼 (識別碼) 。 在此情況下,您必須將識別碼轉換成 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 類型。
相關主題