这道题是关于
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 错误消息可以使用任何受支持的本地语言。例如,在比较英国/英语与德国/德语时,德语可能要长得多。
.NET Core 使用堆栈上的
4096 * sizeof(WCHAR)
缓冲区进行 FormatMessageW
调用。而且......就是这样。