Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: COM/DCOM/ActiveX/ATL/CORBA > _bstr_t to char


Автор: lv151 1.6.2009, 17:17
_CommandPtr pCmdChange
_bstr_t pbstr;
pbstr = pCmdChange->GetCommandText();
char *str;
wcstombs((CHAR*)&str,(OLECHAR*)&pbstr,sizeof(str));
В str абра-кадабра smile, как получить нормальный текст?

Автор: jonie 2.6.2009, 07:11
Цитата
wcstombs((CHAR*)&str,(OLECHAR*)&pbstr,sizeof(str));

имхо вам рано еще соваться в VisualC++, вам бы Cи для начала почитать.

объясняю что вы сделали:
1) первым аргументом вы передали указатель на указатель, притом что последний никто не инициализировал.
2) sizeof(str) на x86 "стандартно" будет 4 байта.
3) str, даже если вы его будете передавать, ничем не инициализирован. Он должен указывать на массив.
4)непонятно зачем написано это: (OLECHAR*)&pbstr, т.к. у _bstr_t  есть operator WCHAR* перегрузка
...

Автор: Andrey44 2.6.2009, 07:32
Цитата(jonie @  2.6.2009,  07:11 Найти цитируемый пост)
имхо вам рано еще соваться в VisualC++, вам бы Cи для начала почитать.

Это точно.
Но что-бы вы не заморачивались сделайте так
Код

char *str = _com_util::ConvertBSTRToString(pbstr.GetBSTR());

Автор: jonie 2.6.2009, 08:59
только нельзя забывать что:

ConvertBSTRToString allocates a string you must delete.
т.е. вызывать SysFreeString() нужно для возрата не забывать, а то течи будут

Автор: lv151 2.6.2009, 09:02
Цитата(jonie @  2.6.2009,  07:11 Найти цитируемый пост)
что последний никто не инициализировал.

_bstr_t pbstr;
pbstr = pCmdChange->GetCommandText(); - а это?

Автор: Andrey44 2.6.2009, 09:14
Цитата(jonie @  2.6.2009,  08:59 Найти цитируемый пост)
т.е. вызывать SysFreeString() нужно для возрата не забывать, а то течи будут

Да-да, все верно. Забыл упомянуть smile

Добавлено через 4 минуты и 45 секунд
Цитата(lv151 @  2.6.2009,  09:02 Найти цитируемый пост)
что последний никто не инициализировал.

_bstr_t pbstr;
pbstr = pCmdChange->GetCommandText(); - а это? 


Цитата(lv151 @  1.6.2009,  17:17 Найти цитируемый пост)
char *str;

Куда он указывает? smile 

Автор: lv151 2.6.2009, 09:25
Цитата(Andrey44 @  2.6.2009,  09:14 Найти цитируемый пост)
char *str;

Куда он указывает?


Я решил что он инициализируется внутри функции.


Автор: Andrey44 2.6.2009, 09:28
Код

//This program illustrates the behavior of the wcstombs function.

  Copy Code 
// crt_wcstombs.c
// compile with: /W3
// This example demonstrates the use
// of wcstombs, which converts a string
// of wide characters to a string of 
// multibyte characters.

#include <stdlib.h>
#include <stdio.h>

#define BUFFER_SIZE 100

int main( void )
{
    size_t  count;
    char    *pMBBuffer = (char *)malloc( BUFFER_SIZE );
    wchar_t *pWCBuffer = L"Hello, world.";

    printf("Convert wide-character string:\n" );

    count = wcstombs(pMBBuffer, pWCBuffer, BUFFER_SIZE ); // C4996
    // Note: wcstombs is deprecated; consider using wcstombs_s instead
    printf("   Characters converted: %u\n",
            count );
    printf("    Multibyte character: %s\n\n",
           pMBBuffer );

    free(pMBBuffer);
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)