|
|
|
CString & LPTSTR
|
|||
|---|---|---|---|
|
#18+
Из рекордсета читаю поле типа CString и ни как не могу поместить его на TreeCtrl (tvItem.pszText типа LPTSTR), вобщем как из CString сделать LPTSTR? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2004, 10:20 |
|
||
|
CString & LPTSTR
|
|||
|---|---|---|---|
|
#18+
Если не используется 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); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2004, 10:56 |
|
||
|
CString & LPTSTR
|
|||
|---|---|---|---|
|
#18+
А вот еще нашел: CString str; ... item.pszText = (LPTSTR)(LPCTSTR)str; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2004, 13:58 |
|
||
|
CString & LPTSTR
|
|||
|---|---|---|---|
|
#18+
EcherА вот еще нашел: CString str; ... item.pszText = (LPTSTR)(LPCTSTR)str; Поступать так - значит искать больших неприятностей. Константный буфер на то и константный, чтобы не меняться. Такое преобразование допускается компилятором и даже иногда работает, но гораздо чаще приводит к большим проблемам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2004, 14:24 |
|
||
|
CString & LPTSTR
|
|||
|---|---|---|---|
|
#18+
авторПоступать так - значит искать больших неприятностей. не совсем так. Смотря чё потом с item.pszText = (LPTSTR)(LPCTSTR)str; делать. если работать, как с sz, то всё нормально. str в хвосте имеет ноль, так что в данном примере всё пойдёт на "ура". Я всегда эти кастом пользуюсь, никогда проблем не было. Кстати, можете привести пример, где бы такой каст привёл бы к ошибке? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2004, 07:32 |
|
||
|
CString & LPTSTR
|
|||
|---|---|---|---|
|
#18+
CEMbКстати, можете привести пример, где бы такой каст привёл бы к ошибке? Сам каст к ошибке привести не может, зато может привести к ошибке использование объекта, полученного с помощью снятия const квалификатора. PS Если бы я увидел в коде снятие этого квалификатора, да ещё и в c-style программисту пришлось бы ДОЛГО мне объяснять почему это ему понадобилось :-/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2004, 08:49 |
|
||
|
CString & LPTSTR
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2004, 11:35 |
|
||
|
CString & LPTSTR
|
|||
|---|---|---|---|
|
#18+
авторСам каст к ошибке привести не может Это-то ясно... авторзато может привести к ошибке использование объекта, полученного с помощью снятия const квалификатора. вот чего пример и просил :) авторto access the null-terminated C string я его так и использую, причём никогда не таскаю отдельный указатель. то бишь использую "сразу" Код: plaintext а не Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2004, 13:32 |
|
||
|
CString & LPTSTR
|
|||
|---|---|---|---|
|
#18+
CEMb strcpy(szTmp,(char*)(LPCTSTR)strTmp); А не проще ли strcpy(szTmp,strTmp); ??? Хотя по смыслу согласен - в случае использования сразу ничего страшного в таком преобразовании нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2004, 13:47 |
|
||
|
CString & LPTSTR
|
|||
|---|---|---|---|
|
#18+
авторвот чего пример и просил :) А он разве нужен? Ну допустим... Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Незнаю как для Вас, но для меня формальный аргумент функции char* говорит о том, что строка будет изменена в этой функции, даже если на самом деле этого не происходит. авторstrcpy(szTmp,(char*)(LPCTSTR)strTmp); Если мне не изменяет память, то у класса CString имеется оператор LPTSTR, ну а cv-преобразование оператор выполнит за нас сам, т.е. (char*)(LPCTSTR) является "шумом", который только загрязнает код. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2004, 15:58 |
|
||
|
|

start [/forum/topic.php?fid=57&gotonew=1&tid=2035231]: |
0ms |
get settings: |
10ms |
get forum list: |
17ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
75ms |
get topic data: |
11ms |
get first new msg: |
6ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 219ms |
| total: | 407ms |

| 0 / 0 |
