严格符合性

启用 STRICT 类型检查时,编译成功的某些源代码可能会生成错误消息。 以下各节介绍了启用 STRICT 时进行代码编译的最低要求。 建议执行其他步骤,尤其是生成可移植代码。

常规要求

主体要求是,必须声明正确的句柄类型和函数指针,而不是依赖更常规的类型。 不能使用需要另一个句柄类型的句柄类型。 这也意味着可能需要更改函数声明并使用更多类型强制转换。

为了获得最佳结果,仅在必要时才应使用泛型 HANDLE 类型。

在应用程序中声明函数

请确保声明所有应用程序函数。 建议将所有函数声明放在包含文件中,因为可以轻松扫描声明并查找应更改的参数和返回类型。

如果使用 /Zg 编译器选项为函数创建头文件,请记住,根据是否启用了 STRICT 类型检查,你将获得不同的结果。 禁用 STRICT 后,所有句柄类型都会生成相同的基类型。 启用 STRICT 后,会生成不同的基类型。 若要避免冲突,每次启用或禁用 STRICT时,都需要重新创建头文件,或编辑头文件以使用 HWNDHDCHANDLE等类型,而不是基类型。

从 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)。 在这种情况下,必须将 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 LPARAMLRESULTLPVOID 的类型 多态数据类型 它们在不同的时间保存不同类型的数据,即使启用 STRICT 类型检查也是如此。 若要获得类型检查的好处,应尽快强制转换这些类型的值。 (请注意,消息破解程序会自动以可移植的方式 wParamlParam

请特别注意区分 HMODULEHINSTANCE 类型。 即使启用了 STRICT,它们也定义为相同的基类型。 大多数内核模块管理功能使用 HINSTANCE 类型,但有几个函数只返回或接受 HMODULE 类型。

禁用 STRICT

启用 STRICT