std::string string_FormatA(const char* lpszFormat,...)
{
std::string re;
va_list vagrc;
va_start(vagrc,lpszFormat);
int nSize = 4096;
re.resize(nSize);
do
{
HRESULT hr = StringCbVPrintfA(re.begin(),nSize,lpszFormat,vagrc);
if (hr == S_OK)
break;
if (HRESULT_CODE(hr) == ERROR_INSUFFICIENT_BUFFER)
{
nSize = nSize*2;
re.resize(nSize);
continue;
}else if (HRESULT_CODE(hr) == STRSAFE_E_INVALID_PARAMETER)
{
va_end(vagrc);
return "";
}
} while (TRUE);
StringCbVPrintfA(re.begin(),nSize,lpszFormat,vagrc);
va_end(vagrc);
re.resize(strlen(re.c_str()));
return re;
}
利用了 StringCbVPrintfA 来计算缓冲区的大小。。。