powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / CString & LPTSTR
11 сообщений из 11, страница 1 из 1
CString & LPTSTR
    #32454260
Echer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Из рекордсета читаю поле типа CString и ни как не могу поместить его на TreeCtrl (tvItem.pszText типа LPTSTR), вобщем как из CString сделать LPTSTR?
...
Рейтинг: 0 / 0
CString & LPTSTR
    #32454356
_Konst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если не используется 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
CString & LPTSTR
    #32454830
Echer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А вот еще нашел:
CString str;
...
item.pszText = (LPTSTR)(LPCTSTR)str;
...
Рейтинг: 0 / 0
CString & LPTSTR
    #32454915
_Konst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
EcherА вот еще нашел:
CString str;
...
item.pszText = (LPTSTR)(LPCTSTR)str;

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

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

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

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

PS Если бы я увидел в коде снятие этого квалификатора, да ещё и в c-style программисту пришлось бы ДОЛГО мне объяснять почему это ему понадобилось :-/
...
Рейтинг: 0 / 0
CString & LPTSTR
    #32456405
_Konst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
CString & LPTSTR
    #32456768
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторСам каст к ошибке привести не может
Это-то ясно...
авторзато может привести к ошибке использование объекта, полученного с помощью снятия 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
CString & LPTSTR
    #32456823
_Konst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость

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

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

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

Код: 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
CString & LPTSTR
    #32457257
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 _Konst
попробуй, компилятор обругает :)

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

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


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