FormatMessage():有没有办法用 FORMAT_MESSAGE_FROM_SYSTEM 避免标记 FORMAT_MESSAGE_ALLOCATE_BUFFER?

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

这道题是关于

FormatMessage()
FORMAT_MESSAGE_FROM_SYSTEM
GetLastError()
的。目标是尽可能使用堆栈分配并避免堆分配。

一些 Win32 API 函数提供了查询大小的方法。如果输出缓冲区太小(包括

NULL
),返回值将是预期的缓冲区大小。示例:
GetTempPath2()
.

当用

FormatMessage()
FORMAT_MESSAGE_FROM_SYSTEM
调用
GetLastError()
时,这似乎是不可能的。

一个想法:使用 8196 char/wchar_t 堆栈分配缓冲区调用

FormatMessage()
。失败时,使用标志
FormatMessage()
再次调用
FORMAT_MESSAGE_ALLOCATE_BUFFER
。系统报错信息居然能长到8196个字符,简直不敢相信!

我试图对最大长度 Win32 系统错误进行一些研究,但我找不到任何可靠的东西。明确地说,我假设 Win32 错误消息可以使用任何受支持的本地语言。例如,在比较英国/英语与德国/德语时,德语可能要长得多。

winapi
1个回答
0
投票

.NET Core 使用堆栈上的

4096 * sizeof(WCHAR)
缓冲区进行
FormatMessageW
调用。而且......就是这样。

https://github.com/dotnet/runtime/blob/3b63eb1346f1ddbc921374a5108d025662fb5ffd/src/coreclr/utilcode/posterror.cpp#L264-L265

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