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

标签 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 字节时,问题没有发生,但不清楚限制是否与传入的参数大小或由此产生的字符串总大小有关产生。 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/

相关文章:

c# - 使用 SetParent 窃取另一个进程的主窗口但保持消息循环独立

尝试在 win 10 中打开设备时,c++ CreateFile() 返回 1(无效函数)

c++ - 如何查找是否可以通过 ShellExecute 打开文档?

C++20 契约和未使用的变量

c++ - Glibc 版本不匹配

c++ - 如果没有目标函数,如何检查约束是否可行?

c - fread 在 C 中是如何工作的?

c++ - 当类层次结构中只有一个类时,避免在每次函数调用时读取 V 表的开销

c - 函数中的数组成员比较不起作用

c++ - 如何动态使用 GetProcAddress