Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: CComBSTR to LPCTSTR  (Прочитано 10943 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Fireworm
Гость
« : 07-08-2003 15:26 » 

Помогите конвертнуть строку из CComBSTR в LPCTSTR.
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #1 : 07-08-2003 17:09 » 

Как я понял CComBSTR - хоть я и не знаю что це таке за объект - очень похоже на MFC.
Исходя из этого должон быть либо перегружен либо определен метод вытяжки стркои из объекта в чистом виде.
После чего обычная строка
a = (LPCTSTR) b;
дает приведение типов - так как конвертирует.
Записан

А птичку нашу прошу не обижать!!!
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #2 : 08-08-2003 05:29 » 

CComBSTR это класс обертка для BSTR, есть оператор operator BSTR(), поэтому можешь преобразовывать ее также как и любой BSTR, который по сути указатель на UNICODE строку.
Таким образом
CComBSTR ccStr(L"Fireworm");
BSTR  bstr;
bstr = ccStr;//вызов ccStr.operator BSTR()
таким образом bstr указывает на UNICODE строку L"Fireworm".
Только внимание- эта строка принадлежит классу ccStr и будет удалена его деструктором, лучше эту строку не трогать и если тебе надо ее изменить, сделай ее копию через SysAllocStringLen.

//-------------------------------------------------------------------------

А вот пример из Platform SDK

// Declare a CComBSTR object. Although the argument is ANSI,
// the constructor converts it into UNICODE.
CComBSTR bstrMyString( "Hello World" );
// Convert the string into an ANSI string
CW2CT szMyString( bstrMyString );
// Display the ANSI string
MessageBox( NULL, szMyString, _T("String Test"), MB_OK );
Записан
Fireworm
Гость
« Ответ #3 : 08-08-2003 06:25 » 

Вся проблема была в том что у меня макросы W2A, W2CT и т.д. ругались на моменте компиляции, и я очень долго не мог понять за что. Оказалась перед использованием макросов надо было вставить
USES_CONVERSION;
и все встало на свои места.
Всем спасибо.
Записан
kisilevski
Постоялец

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 18-08-2003 11:32 » 

Можно и без USER_CONVERSION:

Пусть есть некий BSTR B. и CString s.
В этом случае можно писать s=CString(B).

А ежели надо провести обратное преобразование,
то B=s.AllocSysString();
, поскольку объект типа BSTR-это указатель.
Но после использования надо
освободить занимаемую строкой память:
SysFreeString(B);
Записан

Ложки нет. See MSDN for details.
Fireworm
Гость
« Ответ #5 : 18-08-2003 12:04 » 

Проблема в том, что CString -это класс MFC. Поэтому он совсем не всегда подходит. Да и надо было конвертировать не в CString, а в char *
Записан
Yess
Гость
« Ответ #6 : 25-08-2003 04:09 » 

Только не стоит забывать что макросы типа W2A, A2W и им подобные выделяют память с помощью функции CRT alloca, выделяющей память на стеке(максимум 512кб , если не ошибаюсь). Использование этих макросов оправдано только для небольших кусков текста. Если надо больше(файлы всякие конвертить) тогда MultiByteToWideChar.
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #7 : 25-08-2003 11:50 » 

Цитата

выделяющей память на стеке(максимум 512кб , если не ошибаюсь)


 В юзер моде стек по умолчанию 1Мб, но может быть расширен при сборке программы. Размер стека ограничен только непрерывным куском виртуального адресного пространства.
 В режиме ядра стеки фиксированы и не расширяемы.
Записан
Yess
Гость
« Ответ #8 : 26-08-2003 00:10 » 

Цитата: SlavaI
Цитата

выделяющей память на стеке(максимум 512кб , если не ошибаюсь)


 В юзер моде стек по умолчанию 1Мб, но может быть расширен при сборке программы. Размер стека ограничен только непрерывным куском виртуального адресного пространства.
 В режиме ядра стеки фиксированы и не расширяемы.


Это все верно, просто alloca из червертой студии могла только <512kB выделять, а в VC6 & VC7 поправили, там максимум ограничен размером стека.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines