在C ++中分配StringCchVPrintfW字符串格式缓冲区?

时间:2011-07-06 16:16:14

标签: c++ buffer wstring

我在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 个答案:

没有答案