Поиск:

Ответ в темуСоздание новой темы Создание опроса
> _bstr_t to char 
V
    Опции темы
lv151
Дата 1.6.2009, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 916
Регистрация: 11.2.2008

Репутация: нет
Всего: 2



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

Это сообщение отредактировал(а) lv151 - 1.6.2009, 17:19
PM MAIL   Вверх
jonie
Дата 2.6.2009, 07:11 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 5
Всего: 118



Цитата
wcstombs((CHAR*)&str,(OLECHAR*)&pbstr,sizeof(str));

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

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


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Andrey44
Дата 2.6.2009, 07:32 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 2
Всего: 26



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

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

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



--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
jonie
Дата 2.6.2009, 08:59 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 5
Всего: 118



только нельзя забывать что:

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



--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
lv151
Дата 2.6.2009, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 916
Регистрация: 11.2.2008

Репутация: нет
Всего: 2



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

_bstr_t pbstr;
pbstr = pCmdChange->GetCommandText(); - а это?
PM MAIL   Вверх
Andrey44
Дата 2.6.2009, 09:14 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 2
Всего: 26



Цитата(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 



--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
lv151
Дата 2.6.2009, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 916
Регистрация: 11.2.2008

Репутация: нет
Всего: 2



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

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


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



Это сообщение отредактировал(а) lv151 - 2.6.2009, 09:37
PM MAIL   Вверх
Andrey44
Дата 2.6.2009, 09:28 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 2
Всего: 26



Код

//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);
}



--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0532 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.