Выделение StringCchVPrintfW буфера формата строки в C++?

Я нашел этот код в примере Microsoft Windows SDK:

wstring buffer;
void formatfunction(format, ...) {
    VPRINTF_VAR_PARAMS(buffer, format);
    do_something_with(buffer);
}

#define VPRINTF_VAR_PARAMS(buffer, format)          \
{                                                   \
    buffer.resize(MAX_VPRINTF_BUFFER_SIZE, L'\0');  \
    va_list marker;                                 \
    va_start( marker, format );                     \
    HRESULT hr = StringCchVPrintfW(                 \
        WString2Buffer(buffer),                     \
        buffer.length(),                            \
        format.c_str(),                             \
        marker );                                   \
    if (FAILED(hr)                                  \
        && (hr != STRSAFE_E_INSUFFICIENT_BUFFER))   \
        throw(hr);                                  \
    va_end( marker );                               \
}

где MAX_VPRINTF_BUFFER_SIZE большая константа (4096). Сейчас:

Разве не wstring фактически кодируется в UTF-16 и, следовательно, формат переменной длины (используя более двух байтов для определенных иностранных символов)?

Если, однако, buffer размер до 4096 * 2 байта, в то время как StringCchVPrintfW считается в символах, а не в байтах, это может привести к переполнению буфера, если встречается символ, длина которого превышает 2 байта.

Правильно ли мое предположение? Как можно решить эту проблему?

0 ответов

Другие вопросы по тегам