当传递给 FormatMessage
的参数太长时,我遇到了问题。
void testMessage(UINT id, ...)
{
va_list argList;
va_start(argList, id);
LPTSTR buff = NULL;
const char* str = "The following value is invalid: %1";
DWORD success = FormatMessage(FORMAT_MESSAGE_FROM_STRING|FORMAT_MESSAGE_ALLOCATE_BUFFER,
str, 0, 0, (LPSTR) &buff, 0, &argList);
if(0 == success)
{
DWORD err = GetLastError();
//...
}
va_end(argList);
//...
}
int main(int argc, char** argv)
{
const char* arg = NULL;
// ...
// Initialize arg to some big string about 33,000 bytes long.
// ...
test(0, arg);
}
我收到的错误是 ERROR_MORE_DATA
(234)。当我将 arg
的大小减少到大约 32,000 字节时,问题没有发生,但不清楚限制是否与传入的参数大小或由此产生的字符串总大小有关产生。 MSDN page FormatMessage
上提到了 lpBuffer
参数,“此缓冲区不能大于 64K 字节。”
我可以通过多做一些错误检查并对我传递给这个函数的参数的大小施加一些理智的限制来轻松解决这个问题,但是为了我和其他人将来的引用,知道真正的是什么会很棒限制是。
最佳答案
你调用的是 FormatMessageA
还是 FormateMessageW
?如果您调用 FormatMessageA
,您的 32K ASCII 消息将被编码为 64K Unicode 消息。今天的 Windows 内部是 Unicode,“A”系列函数只是“W”函数的包装器。
关于c++ - FormatMessage 中是否有明确定义的大小限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1800544/