共用方式為


STRICT 合規性

當您啟用 STRICT 類型檢查時,某些成功編譯的原始程式碼可能會產生錯誤訊息。 下列各節說明啟用 STRICT 時,進行程式代碼編譯的最低需求。 建議執行其他步驟,特別是產生可攜式程序代碼。

一般需求

主體需求是您必須宣告正確的句柄類型和函式指標,而不是依賴更一般類型。 您無法使用預期另一個句柄類型。 這也表示您可能必須變更函式宣告,並使用更多類型轉換。

為了獲得最佳結果,只有在需要時才應該使用泛型 HANDLE 類型。

宣告應用程式內的函式

請確定已宣告所有應用程式函式。 建議將所有函式宣告放在 include 檔案中,因為您可以輕易地掃描宣告,並尋找應該變更的參數和傳回類型。

如果您使用 /Zg 編譯程式選項來建立函式的頭檔,請記住,視您是否已啟用 STRICT 類型檢查而定,您會收到不同的結果。 停用 STRICT 時,所有句柄類型都會產生相同的基底類型。 啟用 STRICT 後,它們會產生不同的基底類型。 若要避免衝突,您必須在每次啟用或停用 STRICT時重新建立頭檔,或編輯頭檔以使用 HWND HDCHANDLE類型,而不是基底類型。

從 Windows.h 複製到原始程式碼的任何函式宣告都可能已變更,而且您的本機宣告可能已過期。 拿掉本機宣告。

需要轉換的類型

某些函式具有泛型傳回型別或參數。 例如,SendMessage 函式會根據內容傳回可能為任意數目類型的數據。 當您在原始程式碼中看到上述任何函式時,請確定您使用正確的類型轉換,並盡可能特定。 下列清單是這些函式的範例。

當您呼叫 sendMessageDefWindowProcSendDlgItemMessage時,您應該先將結果轉換成類型 UINT_PTR。 您必須針對傳回 LRESULTLONG_PTR 值的任何函式採取類似的步驟,其中結果包含句柄。 這是撰寫可攜式程式代碼的必要項目,因為句柄的大小會因Windows 版本而異。 (UINT_PTR) 轉換可確保適當的轉換。 下列程式代碼顯示 SendMessage 將句柄傳回筆刷的範例:

HBRUSH hbr;

hbr = (HBRUSH)(UINT_PTR)SendMessage(hwnd, WM_CTLCOLOR, ..., ...);

CreateWindowCreateWindowEx 參數 hmenu 有時會用來傳遞整數控件標識符(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 中將會更具可移植性。

WPARAMLPARAMLRESULTLPVOID 的類型 多型數據類型。 它們在不同的時間保存不同類型的數據,即使啟用 STRICT 類型檢查也一樣。 若要取得類型檢查的優點,您應該儘快轉換這些類型的值。 (請注意,訊息破解工具會以可攜式方式自動 wParamlParam

請特別小心區分 HMODULEHINSTANCE 類型。 即使啟用 STRICT,它們也會定義為相同的基底類型。 大部分的核心模組管理功能都使用 HINSTANCE 類型,但有幾個函式只會傳回或接受 HMODULE 類型。

停用 STRICT

啟用 STRICT