Не могу перевести из BSTR в CString без ошибки т.е как таковое значение я получаю все OK...но если посмотреть GetLastError ом то возникает ошибка 122 The data area passed to a system call is too small. ERROR_INSUFFICIENT_BUFFER....
09.12.06 17:14: Перенесено модератором из 'C/C++. Прикладные вопросы' — Хитрик Денис
А как переводишь-то?
BSTR bstrSource;
CString cout(bstrSource);
А>Не могу перевести из BSTR в CString без ошибки т.е как таковое значение я получаю все OK...но если посмотреть GetLastError ом то возникает ошибка 122 The data area passed to a system call is too small. ERROR_INSUFFICIENT_BUFFER....... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Здравствуйте, <Аноним>, Вы писали:
А>Не могу перевести из BSTR в CString без ошибки т.е как таковое значение я получаю все OK...но если посмотреть GetLastError ом то возникает ошибка 122 The data area passed to a system call is too small. ERROR_INSUFFICIENT_BUFFER....
GetLastError() имеет смысл только если предыдущая функция вернула ошибку. Она вернула?
... << RSDN@Home 1.2.0 alpha rev. 668>>
Здравствуйте, XPiS, Вы писали:
XPS>А как переводишь-то?
XPS>XPS>BSTR bstrSource;
XPS>CString cout(bstrSource);
XPS>
А>>Не могу перевести из BSTR в CString без ошибки т.е как таковое значение я получаю все OK...но если посмотреть GetLastError ом то возникает ошибка 122 The data area passed to a system call is too small. ERROR_INSUFFICIENT_BUFFER....
Как только не приравнивал все равно таже ошибка.....
>Не могу перевести из BSTR в CString без ошибки т.е как таковое значение я получаю все OK...но если посмотреть GetLastError ом то возникает ошибка 122 The data area passed to a system call is too small. ERROR_INSUFFICIENT_BUFFER....
Чем постить сюда уже вторую ветку, можно было бы залезть в дебаггере в исходники MFC:
CStringT& operator=( __in PCYSTR pszSrc )
{
// nDestLength is in XCHARs
int nDestLength = (pszSrc != NULL) ? StringTraits::GetBaseTypeLength( pszSrc ) : 0; // (1)
if( nDestLength > 0 )
{
PXSTR pszBuffer = GetBuffer( nDestLength );
StringTraits::ConvertToBaseType( pszBuffer, nDestLength, pszSrc); // (2)
ReleaseBufferSetLength( nDestLength );
}
else
{
Empty();
}
return( *this );
}
в строчке (1) определяем длину необходимого буфера, а в строчке (2) передаём этот буфер в ConvertToBaseType, которая вызовет в данном случае MultiByteToWideChar. А вот MultiByteToWideChar и ругается, что мало памяти, и её можно понять — неплохо бы в строчке (1) учесть, что под завершающий ноль память тоже нужна, и если в дебаггере сразу после выполнения (1) увеличить nDestLength на 1, то (2) завершается без ошибок... Самое странное то, что строчка (1) в лице GetBaseTypeLength на самом деле использует ту же самую WideCharToMultiByte для определения длины необходимого буфера, которая для строчки "Test BSTR string" возвращает 16 — её длину без учёта \0 в конце... Такой вот ляпсус в винде?
короче, хочешь без ошибок, юзай другие методы:
BSTR bstr = ::SysAllocString(L"Test BSTR string");
...
CString str = W2T(bstr);
/*или*/
str = CW2T(bstr);
str = LPCTSTR(_bstr_t(bstr, true/*или false - смотря, как надо*/));
и т.д.
Homo sum et nihil humani a me alienum puto...

Здравствуйте, <Аноним>, Вы писали:
А>Не могу перевести из BSTR в CString без ошибки т.е как таковое значение я получаю все OK...но если посмотреть GetLastError ом то возникает ошибка 122 The data area passed to a system call is too small. ERROR_INSUFFICIENT_BUFFER....
BSTR bs = ...........;
CString s = static_cast<const TCHAR*>(bstr_t(bs));
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>