Выделение 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 байта.
Правильно ли мое предположение? Как можно решить эту проблему?