严格符合性
启用 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 类型。
相关主题