Не могу перевести из BSTR в CString без ошибки
От: Аноним  
Дата: 08.12.06 07:07
Оценка:
Не могу перевести из 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++. Прикладные вопросы' — Хитрик Денис
Re: Не могу перевести из BSTR в CString без ошибки
От: XPiS Украина  
Дата: 08.12.06 07:57
Оценка:
А как переводишь-то?

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>>
Re: Не могу перевести из BSTR в CString без ошибки
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 08.12.06 08:08
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Не могу перевести из 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>>
Re[2]: Не могу перевести из BSTR в CString без ошибки
От: Аноним  
Дата: 08.12.06 09:55
Оценка:
Здравствуйте, 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....



Как только не приравнивал все равно таже ошибка.....
Re: Не могу перевести из BSTR в CString без ошибки
От: Вумудщзук Беларусь  
Дата: 08.12.06 14:12
Оценка:
>Не могу перевести из 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...
Re: Не могу перевести из BSTR в CString без ошибки
От: rm822 Россия  
Дата: 08.12.06 14:23
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Не могу перевести из 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>>
Re[2]: Не могу перевести из BSTR в CString без ошибки
От: Аноним  
Дата: 10.12.06 02:04
Оценка:
Здравствуйте, rm822, Вы писали:

R>CString s = static_cast<const TCHAR*>(bstr_t(bs));

CString s = bs; вполне достаточно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.