小编Kri*_*hty的帖子

Win32 宽字符串对齐要求

我将 GUI 代码中的问题缩小到SetWindowTextW(HWND, wchar_t *)如果新窗口标题未与两个字节对齐则默默失败。在本例中,SetWindowText()返回1( success ) 但不设置新文本。

\n

MSVC 上的自然对齐wchar_t是 2 个字节,所以这绝对是我的错误。但为了确保我尝试找到 Win32 字符串的对齐规则。

\n

我没有找到官方文档,只是一个旧的新闻组帖子提到了 Open Watcom 编译器\xc2\xa0\xe2\x80\x93的错误报告,该报告声称Windows NT 上的 Win32 和 COM 实际上需要4 字节对齐!虽然这对我来说似乎很奇怪,但我注意到 MSVC 确实将每个wchar_t文字对齐到四个字节,而不是两个。实际上,您可以wchar_t通过 使 MSVC 更密集地打包常量字符串alignas(2)。Win32 中的堆粒度也 >=8 字节。

\n

如果 Win32 需要对宽字符字符串进行四字节对齐(如源声明),并且 API 调用在错误的数据对齐上默默失败(如SetWindowText()1 字节对齐),我感觉遇到了很大的麻烦。

\n

有没有官方文档说明 Win32/COM 中宽字符串的明确对齐要求?是两个字节还是四个字节?

\n
\n

重现问题的代码:

\n
#include <Windows.h>\n#include <CommCtrl.h>\n#include <cassert>\n\nint main() {\n\n  auto …
Run Code Online (Sandbox Code Playgroud)

c++ winapi abi memory-alignment

6
推荐指数
1
解决办法
294
查看次数

标签 统计

abi ×1

c++ ×1

memory-alignment ×1

winapi ×1