Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / CString & LPTSTR / 11 сообщений из 11, страница 1 из 1
24.03.2004, 10:20
    #32454260
Echer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CString & LPTSTR
Из рекордсета читаю поле типа CString и ни как не могу поместить его на TreeCtrl (tvItem.pszText типа LPTSTR), вобщем как из CString сделать LPTSTR?
...
Рейтинг: 0 / 0
24.03.2004, 10:56
    #32454356
_Konst
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CString & LPTSTR
Если не используется unicode LPTSTR определен как
typedef char* LPTSTR

У CString есть оператор приведения типа только к LPCTSTR, который в свою очередь определен как
typedef const char* LPCTSTR

Вариантов получения из CString char* два:

1.
CString str;
.....
char* pStr = str.GetBuffer();


2.
char pStr[128];
CString str;
....
strcpy(pStr, str);
...
Рейтинг: 0 / 0
24.03.2004, 13:58
    #32454830
Echer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CString & LPTSTR
А вот еще нашел:
CString str;
...
item.pszText = (LPTSTR)(LPCTSTR)str;
...
Рейтинг: 0 / 0
24.03.2004, 14:24
    #32454915
_Konst
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CString & LPTSTR
EcherА вот еще нашел:
CString str;
...
item.pszText = (LPTSTR)(LPCTSTR)str;

Поступать так - значит искать больших неприятностей. Константный буфер на то и константный, чтобы не меняться. Такое преобразование допускается компилятором и даже иногда работает, но гораздо чаще приводит к большим проблемам.
...
Рейтинг: 0 / 0
25.03.2004, 07:32
    #32455990
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CString & LPTSTR
авторПоступать так - значит искать больших неприятностей.

не совсем так.
Смотря чё потом с item.pszText = (LPTSTR)(LPCTSTR)str; делать.
если работать, как с sz, то всё нормально. str в хвосте имеет ноль, так что в данном примере всё пойдёт на "ура".
Я всегда эти кастом пользуюсь, никогда проблем не было.

Кстати, можете привести пример, где бы такой каст привёл бы к ошибке?
...
Рейтинг: 0 / 0
25.03.2004, 08:49
    #32456031
well_wisher_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CString & LPTSTR
CEMbКстати, можете привести пример, где бы такой каст привёл бы к ошибке?

Сам каст к ошибке привести не может, зато может привести к ошибке использование объекта, полученного с помощью снятия const квалификатора.

PS Если бы я увидел в коде снятие этого квалификатора, да ещё и в c-style программисту пришлось бы ДОЛГО мне объяснять почему это ему понадобилось :-/
...
Рейтинг: 0 / 0
25.03.2004, 11:35
    #32456405
_Konst
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CString & LPTSTR
msdn по поводу оператора LPCTSTRThis useful casting operator provides an efficient method to access the null-terminated C string contained in a CString object. No characters are copied; only a pointer is returned. Be careful with this operator. If you change a CString object after you have obtained the character pointer, you may cause a reallocation of memory that invalidates the pointer.

В данном конкретном случае действительно неприятностей ждать не стоит. Поле pszText в структуре TVITEM объявлено char* не потому, что сам контрол может поменять его содержимое (он-то видимо сразу после InsertItem копирует содержимое во внутренний буфер), а чтобы сам пользователь в случае необходимости мог менять текст. Однако название поста предполагало более широкую трактовку вопроса - сюда могут заглянуть не только те, кому надо вставить итем в TreeCtrl.
...
Рейтинг: 0 / 0
25.03.2004, 13:32
    #32456768
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CString & LPTSTR
авторСам каст к ошибке привести не может
Это-то ясно...
авторзато может привести к ошибке использование объекта, полученного с помощью снятия const квалификатора.
вот чего пример и просил :)

авторto access the null-terminated C string
я его так и использую, причём никогда не таскаю отдельный указатель.
то бишь использую "сразу"

Код: plaintext
strcpy(szTmp,(char*)(LPCTSTR)strTmp);

а не
Код: plaintext
1.
2.
3.
4.
pszTmp = (char*)(LPCTSTR)strTmp;
//прошло время...

strcpy(szTmp,pszTmp);
 
...
Рейтинг: 0 / 0
25.03.2004, 13:47
    #32456823
_Konst
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CString & LPTSTR

CEMb strcpy(szTmp,(char*)(LPCTSTR)strTmp);
А не проще ли
strcpy(szTmp,strTmp); ???

Хотя по смыслу согласен - в случае использования сразу ничего страшного в таком преобразовании нет.
...
Рейтинг: 0 / 0
25.03.2004, 15:58
    #32457190
well_wisher_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CString & LPTSTR
авторвот чего пример и просил :)

А он разве нужен? Ну допустим...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CString str( "тырым-пырым" );
char * pstr = (char  *)str;
foo(pstr);

printf( "%s\r\n" , str); // что попадет в cout?

void foo(char * str)
{
    for ( ; *str; ++str) *str = 'x';
}


Незнаю как для Вас, но для меня формальный аргумент функции char* говорит о том, что строка будет изменена в этой функции, даже если на самом деле этого не происходит.

авторstrcpy(szTmp,(char*)(LPCTSTR)strTmp);
Если мне не изменяет память, то у класса CString имеется оператор LPTSTR, ну а cv-преобразование оператор выполнит за нас сам, т.е. (char*)(LPCTSTR) является "шумом", который только загрязнает код.
...
Рейтинг: 0 / 0
25.03.2004, 16:17
    #32457257
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CString & LPTSTR
2 _Konst
попробуй, компилятор обругает :)

2 well_wisher_
О! Спасиба! Блин, никогда не задумывался, как увидел пример с констом, так и юзал :)

Жить стало проще :)
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / CString & LPTSTR / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]