Как вывести полную строку типа BSTR в поток cout?
От: Dimman  
Дата: 16.10.02 08:13
Оценка:
Добрый день!
Пишу СОМ-клиента на MS VC6. Сервер вернул в переменную VARIANT строку.
Фрагмент кода выглядит примерно так:


VARIANT    pVarResult;

pVarResult.vt = VT_BSTR;
hresult       = pdisp->Invoke(..., ... , ..., ..., ..., &pVarResult, ..., ...);

cout<<"Строка : "<<(char*)pVarResult.bstrVal<<endl;


________________________________________________________________________________

В результате печатается первый символ полученной строки (если строка состоит из латинских символов)
либо "мусор" (если строка на русском).

Подскажите, пожалуйста, как вывести полную строку, причем на русском.
Re: Как вывести полную строку типа BSTR в поток cout?
От: Nikto Россия  
Дата: 16.10.02 08:16
Оценка:
Здравствуйте Dimman, Вы писали:

Я бы посоветовал так:

D>
D>VARIANT    pVarResult;

D>pVarResult.vt = VT_BSTR;
D>hresult       = pdisp->Invoke(..., ... , ..., ..., ..., &pVarResult, ..., ...);

D>cout<<"Строка : "<<(char*)_bstr_t(pVarResult.bstrVal)<<endl;
D>


D>________________________________________________________________________________
Re[2]: Как вывести полную строку типа BSTR в поток cout?
От: Torero2002 Россия  
Дата: 16.10.02 08:38
Оценка:
Здравствуйте Nikto, Вы писали:

N>Здравствуйте Dimman, Вы писали:


N>Я бы посоветовал так:


D>>
D>>VARIANT    pVarResult;

D>>pVarResult.vt = VT_BSTR;
D>>hresult       = pdisp->Invoke(..., ... , ..., ..., ..., &pVarResult, ..., ...);

D>>cout<<"Строка : "<<(char*)_bstr_t(pVarResult.bstrVal)<<endl;
D>>


D>>________________________________________________________________________________



Я бы посоветовал сделать так:

_variant_t VarResult;

try
{
  VarResult = pdisp->Invoke(..., ... , ..., ..., ..., ..., ...);
}
catch(const _com_error & e)
{
...
}
cout<<"Строка : "<<_bstr_t(pVarResult.bstrVal)<<endl;//Здесь явно приводить к char* не надо


Здесь pdisp объявлен как IDispatchPtr
Smart? Prove it!
Re[2]: Как вывести полную строку типа BSTR в поток cout?
От: Dimman  
Дата: 16.10.02 09:38
Оценка:
Спасибо за внимание к моей проблеме.
Предложенные варианты великолепно работают!
Только с русскими символами проблема прежняя — нечитабельно
Re[3]: Как вывести полную строку типа BSTR в поток cout?
От: Nikto Россия  
Дата: 16.10.02 09:39
Оценка:
Здравствуйте Dimman, Вы писали:

D>Спасибо за внимание к моей проблеме.

D>Предложенные варианты великолепно работают!
D>Только с русскими символами проблема прежняя — нечитабельно

А это уже вопрос про вывод в консоль русских букв . Воспользуйся поиском — не раз обсуждалось...
Re[3]: Как вывести полную строку типа BSTR в поток cout?
От: Аноним  
Дата: 16.10.02 10:09
Оценка:
Здравствуйте Dimman, Вы писали:

D>Спасибо за внимание к моей проблеме.

D>Предложенные варианты великолепно работают!
D>Только с русскими символами проблема прежняя — нечитабельно

Попробуй использовать wcout.

Вначале прошипи:

std::wcout.imbue(std::locale("Russian_Russia.866"));
Re[4]: Как вывести полную строку типа BSTR в поток cout?
От: Dimman  
Дата: 16.10.02 10:42
Оценка:
Здравствуйте Nikto, Вы писали:

N>А это уже вопрос про вывод в консоль русских букв . Воспользуйся поиском — не раз обсуждалось...


Действительно обсуждалась
Блеск, спасибо!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.