代码之家  ›  专栏  ›  技术社区  ›  Owen

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

  •  0
  • Owen  · 技术社区  · 16 年前

    当参数传递给时,我遇到问题 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 arg 对于大约32000字节,这个问题不会发生,但是不清楚这个限制是与传入的参数大小有关,还是与生成的字符串的总大小有关。这个 MSDN page 格式化消息 说到 lpBuffer 参数“此缓冲区不能大于64K字节。”

    1 回复  |  直到 16 年前
        1
  •  1
  •   MSalters    16 年前

    你打电话来吗 FormatMessageA FormateMessageW 格式化消息a ,您的32K ASCII消息将被编组为64K Unicode消息。今天的Windows在内部是Unicode的,“A”系列函数只是围绕“W”函数的包装。