Win32 宽字符串对齐要求

问题描述 投票:0回答:1

我将 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中宽字符串的明确对齐要求?是两个字节还是四个字节?

c++ winapi memory-alignment abi
1个回答
0
投票

一般来说,Win32 API 几乎所有内容都需要 8 字节对齐,不仅是字符串,还包括结构体等。

使用 Windows 标头

项目应编译为使用默认结构打包,当前为 8 字节,因为最大的整型类型为 8 字节。这样做可以确保头文件中的所有结构类型都按照 Windows API 期望的相同对齐方式编译到应用程序中。它还确保具有 8 字节值的结构正确对齐,并且不会在强制数据对齐的处理器上导致对齐错误。

有关更多信息,请参阅 /Zp(结构成员对齐)pack

Windows SDK 头文件需要什么样的结构打包?

/Zp8

© www.soinside.com 2019 - 2024. All rights reserved.