如何将va_list传递给 wsprintfW()?

How do I pass va_list to wsprintfW()?

提问人:Jack 提问时间:12/3/2020 更新时间:12/3/2020 访问量:424

问:

我正在尝试制作一个自定义的类似 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");

返回错误:

enter image description here

C winapi windows-10 variadic-functions 错误报告

评论


答:

3赞 1201ProgramAlarm 12/3/2020 #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);
}

评论

2赞 Remy Lebeau 12/3/2020
请注意,它不会对输出执行边界检查,因此可能会溢出。请考虑改用 _vsnwprintf()、StringCbVPrintfW() 或 StringCchVPrintfW()。 wvsprintfW()buffer
1赞 Remy Lebeau 12/3/2020
否则,至少允许您查询所需的长度,以便可以动态分配给正确的长度,从而允许输出字符串长度超过 1024 个字符。_vsnwprintf()buffer