【问题标题】:How do I pass va_list to wsprintfW()?如何将 va_list 传递给 wsprintfW()?
【发布时间】:2021-03-14 18:55:59
【问题描述】:

我正在尝试制作一个自定义的类似 printf 的函数,它接受参数、格式化然后显示在 MessageBox 上,但 wsprintfW 无法正常工作,它显示一些汉字,我认为编码在某处搞砸了,但我可以'不知道在哪里。如何解决?

代码:

void panic(const wchar_t *fmt, ...)
{
    wchar_t buffer[1024];
    va_list args = NULL;
    va_start(args, fmt);
    wsprintfW(buffer, fmt, args);
    va_end(args);
    MessageBoxW(NULL, buffer, L"error", MB_OK | MB_ICONERROR);
    ExitProcess(EXIT_FAILURE);
}

来自:

panic(L"hello, %s!", L"michael");

返回错误:

【问题讨论】:

    标签: c winapi windows-10 variadic-functions error-reporting


    【解决方案1】:

    您需要使用wvsprintfW 函数。 (注意函数名中的“v”第二个字母。)

    void panic(const wchar_t *fmt, ...)
    {
        wchar_t buffer[1024];
        va_list args = NULL;
        va_start(args, fmt);
        wvsprintfW(buffer, fmt, args);
        va_end(args);
        MessageBoxW(NULL, buffer, L"error", MB_OK | MB_ICONERROR);
        ExitProcess(EXIT_FAILURE);
    }
    

    【讨论】:

    • 请注意wvsprintfW() 不对输出buffer 执行边界检查,因此可能会发生溢出。考虑改用_vsnwprintf()StringCbVPrintfW()StringCchVPrintfW()
    • 否则,_vsnwprintf() 至少允许您查询所需的长度,以便 buffer 可以动态分配到正确的长度,允许输出字符串长度超过 1024 个字符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-29
    • 1970-01-01
    • 1970-01-01
    • 2017-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多