我将 GUI 代码中的问题缩小为:如果新窗口标题未与两个字节对齐,则
SetWindowTextW(HWND, wchar_t *)
会默默失败。在这种情况下,SetWindowText()
返回1
(成功),但不设置新文本。
MSVC 上
wchar_t
的自然对齐是 2 个字节,所以这绝对是我的错误。但为了确保我尝试找到 Win32 字符串的对齐规则。
我没有找到任何官方文档,只是一个旧的新闻组线程提到了 Open Watcom 编译器的错误报告 – 其中声称 Windows NT 上的 Win32 和 COM 实际上需要 4 字节 对齐!虽然这对我来说似乎很奇怪,但我注意到 MSVC 确实将每个
wchar_t
文字对齐到 four 字节,而不是两个。实际上,您可以通过 wchar_t
使 MSVC 打包 alignas(2)
常量字符串更密集。 Win32 中的堆粒度也 >=8 字节。
如果 Win32 要求对宽字符字符串进行四字节对齐(如源声明),并且 API 调用因错误的数据对齐而默默失败(如
SetWindowText()
对 1 字节对齐所做的那样),我感觉陷入了大麻烦。
有没有官方文档说明Win32/COM中宽字符串的明确对齐要求?是两个字节还是四个字节?
一般来说,Win32 API 几乎所有内容都需要 8 字节对齐,不仅是字符串,还包括结构体等。
项目应编译为使用默认结构打包,当前为 8 字节,因为最大的整型类型为 8 字节。这样做可以确保头文件中的所有结构类型都按照 Windows API 期望的相同对齐方式编译到应用程序中。它还确保具有 8 字节值的结构正确对齐,并且不会在强制数据对齐的处理器上导致对齐错误。
有关更多信息,请参阅 /Zp(结构成员对齐) 或 pack。
/Zp8