FormatMessage中是否有明确定义的大小限制?

时间:2009-11-25 23:00:06

标签: c++ c winapi

传递给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字节时,问题不会发生,但是不清楚限制是否与传入的参数大小或生成的字符串的总大小有关。 FormatMessage上的MSDN page说明了lpBuffer参数,“此缓冲区不能超过64K字节。”

我可以通过做一些错误检查并对我传递给这个函数的参数的大小设置一些合理的限制来轻松解决这个问题,但是对于我和其他人的未来参考,知道什么是真实的将是很好的。限制是。

1 个答案:

答案 0 :(得分:1)

您是在呼叫FormatMessageA还是FormateMessageW?如果您呼叫FormatMessageA,您的32K ASCII消息将被编组为64K Unicode消息。今天的Windows是内部Unicode,“A”系列函数只是“W”函数的包装。