Re[2]: CString to char *
От: Saddam Россия http://saddam.narod.ru
Дата: 16.07.03 06:28
Оценка: -4
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, godwizard, Вы писали:


G>>Как преобразовать CString в char *?


А>По-моему, если CString str;

А>То str.GetBuffer(str.GetLength()); это оно и будет.
Который раз тут уже это спрашивают, и это отвечают

   pChar=(LPCSTR)str;
- Вы знаете — жаль, просто по-человечески жаль Памелу Андерсон, которая никогда не сможет сыграть на баяне...
Re: CString to char *
От: Аноним  
Дата: 16.07.03 05:20
Оценка: 15 (1)
Здравствуйте, godwizard, Вы писали:

G>Как преобразовать CString в char *?


По-моему, если CString str;
То str.GetBuffer(str.GetLength()); это оно и будет.
Re[2]: CString to char *
От: B_A_D Израиль  
Дата: 16.07.03 06:29
Оценка: 10 (1)
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, godwizard, Вы писали:


G>>Как преобразовать CString в char *?


А>По-моему, если CString str;

А>То str.GetBuffer(str.GetLength()); это оно и будет.


Не забыв после этого обязательно вызвать str.ReleaseBuffer().

CString str("Some text");
LPTSTR pstr = str.GetBuffer( 10 );
strcpy(pstr, "Hello" );
str.ReleaseBuffer( );


Второй вариант — оператор LPCTSTR .

Например:



 CString str("Some text");
 char S[100];
 strcpy(S, (LPCTSTR)str);
Re[4]: CString to char *
От: rikkitikkitavi Россия  
Дата: 16.07.03 08:44
Оценка: -1
Здравствуйте, Дмитрий Наумов, Вы писали:

ДН>а если TCHAR != char что делать то будем?...


а вот что:


pChar = (LPCTSTR) str;
Re[4]: CString to char *
От: Mutabor  
Дата: 16.07.03 09:36
Оценка: -1
Здравствуйте, Дмитрий Наумов, Вы писали:

ДН>Здравствуйте, Saddam, Вы писали:


S>>Который раз тут уже это спрашивают, и это отвечают


S>>
S>>   pChar=(LPCSTR)str;
S>>


ДН>а если TCHAR != char что делать то будем?...


pChar=(LPCTSTR)str;
... << RSDN@Home 1.1 beta 1 >>
Re[6]: CString to char *
От: BlackHeretic Израиль  
Дата: 16.07.03 10:39
Оценка: +1
Здравствуйте, Дмитрий Наумов, Вы писали:

ДН>Здравствуйте, Mutabor, Вы писали:


S>>>>
S>>>>   pChar=(LPCSTR)str;
S>>>>


ДН>>>а если TCHAR != char что делать то будем?...


M>>pChar=(LPCTSTR)str;


ДН>Ну блин, я ж не вчера родился. В ситуации, когда TCHAR != char

ДН>делай приведение хоть в LPCSTR хоть LPCTSTR — char* из CString (а именно это и просилось человеком) не получишь. То есть все ваши ответы правильны, только не для UNICODE


Это универсально.

#include <atlconv.h>

void   func1(const char* pChar)
{




}

void   func2()
{
  USES_CONVERSION;

  CString str = _T("Some string");
  func1( T2CA((LPCTSTR)str));
}
ICQ 156156278
Re[7]: Господа, хватит давать вредоносные советы
От: Patalog Россия  
Дата: 17.07.03 09:41
Оценка: +1
Здравствуйте, Saddam, Вы писали:

[]

P>>Именно из-за возможных конструкций типа

P>>
P>>char* str = (LPTSTR)(LPCTSTR)some_text;
P>>strcpy(str, "Hello, World!");
P>>


S>Нууу... Для этого надо быть полным идиотом


Нууу.... Практика показывает, что почти все когда-то наступали на подобные грабли.
Тем более, что в столь утрированном варианет (выше) сие встречается довольно редко. Обычно все немного тоньше, типа:
char* buffer = (LPTSTR)(LPCTSTR)some_text;
...
...
...
//где-то там...
CFile file;
file.Open(...);
UINT bytes_read = file.Read(buffer, 100);
...


S>Тем более, что:

S>
S>some_text="Hello, World!";
S>

S>Работает куда лучше.
S>Собственно, запись char * в CString, ИМХО, так и делается

Как так?

P>>Вообще то однозначно принято что раз не const, значит на запись. Более другие случаи обычно оговариваются отдельно.


S>Кем принято? То есть, если функция возвращает char *, то можно сделать так:

S>
S>char * somefunc();
S>....
S>strcpy (somefunc(),pConstChar);
S>

S>

Да, именно это подразумевается. Напр. strdup.

P>>А автор может потому и молчит, что отлаживается?


S>Следуя всем советам по очереди

S>>>Вообще-то в 7-й студии
S>>>
S>>>typedef ATL::CStringT< TCHAR, StrTraitMFC< TCHAR > > CString;
S>>>

S>>>Так, что с юникодом, я думаю, библиотека справится нормально.

P>>И какое собст. это имеет отношение в случае приведения к char*?


S>Есть такой define — _UNICODE — если он стоит — то TCHAR = wchar_t, то есть Unicode ваш любимый, по крайней мере, я так понял из MSDN.


Ну и? Праально, получится wchar_t*. Но, повторюсь, какое отношение это имеет к char*?

S>А вообще — в моей работе, например, главное, чтобы текст прочесть можно было


Сильно. А какой текст имеется в виду?
А вообще, какая бы ни была работа, делать нужно правильно, и стараться не разбрасывать себе же под ноги грабли. Это даже если не учитывать, что возможно твой код будут сопровождать другие.
Почетный кавалер ордена Совка.
CString to char *
От: godwizard Россия  
Дата: 16.07.03 05:18
Оценка:
Как преобразовать CString в char *?
Best regards
Re[3]: CString to char *
От: Дмитрий Наумов  
Дата: 16.07.03 06:44
Оценка:
Здравствуйте, Saddam, Вы писали:

S>Который раз тут уже это спрашивают, и это отвечают


S>
S>   pChar=(LPCSTR)str;
S>


а если TCHAR != char что делать то будем?...
Re[5]: CString to char *
От: Дмитрий Наумов  
Дата: 16.07.03 09:28
Оценка:
Здравствуйте, rikkitikkitavi, Вы писали:

R>
R>pChar = (LPCTSTR) str;
R>


Так вот именно что! Тока типа ifdef писать придется, потому что это уже будет не char*
Re[5]: CString to char *
От: Дмитрий Наумов  
Дата: 16.07.03 09:45
Оценка:
Здравствуйте, Mutabor, Вы писали:

S>>>
S>>>   pChar=(LPCSTR)str;
S>>>


ДН>>а если TCHAR != char что делать то будем?...


M>pChar=(LPCTSTR)str;


Ну блин, я ж не вчера родился. В ситуации, когда TCHAR != char
делай приведение хоть в LPCSTR хоть LPCTSTR — char* из CString (а именно это и просилось человеком) не получишь. То есть все ваши ответы правильны, только не для UNICODE
Re[4]: CString to char *
От: Saddam Россия http://saddam.narod.ru
Дата: 16.07.03 10:52
Оценка:
Здравствуйте, Дмитрий Наумов, Вы писали:

ДН>Здравствуйте, Saddam, Вы писали:


S>>Который раз тут уже это спрашивают, и это отвечают


S>>
S>>   pChar=(LPCSTR)str;
S>>


ДН>а если TCHAR != char что делать то будем?...

Попробуем так:

//Example 1
// Convert LPCWSTR to LPCSTR.
void ExampleFunctionW( LPCWSTR pszW )
{
   // Create an instance of CW2A, called pszA,
   // and initialize it with pszW.
   CW2A pszA( pszW );
   // pszA works like an LPCSTR, and can be used thus:
   ExampleFunctionA( pszA );  
   // Note: pszA will become invalid when it goes out of scope.
}


Все грядущие вопросы можно задать страничке:
ms-help://MS.MSDNQTR.2002JAN.1033/vclib/html/_atl_String_Conversion_Macros.htm
или где-то рядом

В MSDN есть все!
- Вы знаете — жаль, просто по-человечески жаль Памелу Андерсон, которая никогда не сможет сыграть на баяне...
Re[3]: Господа, хватит давать вредоносные советы
От: Patalog Россия  
Дата: 17.07.03 07:06
Оценка:
Здравствуйте, Saddam, Вы писали:

хъ

S>   pChar=(LPCSTR)str;


Подобное приведение возможно лишь в весьма ограниченных случаях, типа
LVITEM lvi = { 0 };
lvi.pszText = (LPTSTR)(LPCTSTR)string;

а поскольку в исходном посте область применения явно не оговаривалась, следует исходить из предположения об общем случае применения.
И это применение, что явствует именно из char* (а не const char*) — буфер на запись. Поэтому подобные ответы мягко говоря некорректны, и более того потенциально опасны. Это даже если не касаться проблемы UNICODE, как правильно заметил Дмитрий.
Почетный кавалер ордена Совка.
Re[4]: Господа, хватит давать вредоносные советы
От: Дмитрий Наумов  
Дата: 17.07.03 07:41
Оценка:
Здравствуйте, Patalog, Вы писали:

Да, действительно, заданный вопрос не содержал никаких ограничений, поэтому общие ответы в стиле "...надо прикастить к ..." потенциально опасны. Patalog'у спасибо за поддержку!
Re[4]: Господа, хватит давать вредоносные советы
От: Saddam Россия http://saddam.narod.ru
Дата: 17.07.03 07:56
Оценка:
Здравствуйте, Patalog, Вы писали:

P>Здравствуйте, Saddam, Вы писали:


P>хъ


P>
S>>   pChar=(LPCSTR)str;
P>


P>Подобное приведение возможно лишь в весьма ограниченных случаях, типа

P>
P>LVITEM lvi = { 0 };
P>lvi.pszText = (LPTSTR)(LPCTSTR)string;
P>

Именно в этом случае получается бред. Сильно сомневаюсь, что LVITEM имеет готовый буфер под текст.
P>а поскольку в исходном посте область применения явно не оговаривалась, следует исходить из предположения об общем случае применения.
P>И это применение, что явствует именно из char* (а не const char*) — буфер на запись. Поэтому подобные ответы мягко говоря некорректны, и более того потенциально опасны. Это даже если не касаться проблемы UNICODE, как правильно заметил Дмитрий.
Может спросить у создавшего тему, для чего ему char *? Для записи, или чтения? Что-то он молчит.
Интересно, почем-же такие советы вредны?
Вообще-то в 7-й студии
typedef ATL::CStringT< TCHAR, StrTraitMFC< TCHAR > > CString;

Так, что с юникодом, я думаю, библиотека справится нормально.
- Вы знаете — жаль, просто по-человечески жаль Памелу Андерсон, которая никогда не сможет сыграть на баяне...
Re[5]: Господа, хватит давать вредоносные советы
От: Дмитрий Наумов  
Дата: 17.07.03 08:02
Оценка:
Здравствуйте, Saddam, Вы писали:

S>Вообще-то в 7-й студии

S>
S>typedef ATL::CStringT< TCHAR, StrTraitMFC< TCHAR > > CString;
S>

S>Так, что с юникодом, я думаю, библиотека справится нормально.

И как это вам помогает в случае unicode? CString то будет содержать TCHAR == WCHAR, но кастом LPCTSTR вы char* не получите!
Re[5]: Господа, хватит давать вредоносные советы
От: Patalog Россия  
Дата: 17.07.03 08:08
Оценка:
Здравствуйте, Saddam, Вы писали:

[]

P>>Подобное приведение возможно лишь в весьма ограниченных случаях, типа

P>>
P>>LVITEM lvi = { 0 };
P>>lvi.pszText = (LPTSTR)(LPCTSTR)string;
P>>


S> Именно в этом случае получается бред. Сильно сомневаюсь, что LVITEM имеет готовый буфер под текст.


Да, забыл добавить, только в случае SetItem.
Вот видишь, ты уже сам понимаешь что некошерно так делать.

P>>а поскольку в исходном посте область применения явно не оговаривалась, следует исходить из предположения об общем случае применения.

P>>И это применение, что явствует именно из char* (а не const char*) — буфер на запись. Поэтому подобные ответы мягко говоря некорректны, и более того потенциально опасны. Это даже если не касаться проблемы UNICODE, как правильно заметил Дмитрий.

S>Может спросить у создавшего тему, для чего ему char *? Для записи, или чтения? Что-то он молчит.

S>Интересно, почем-же такие советы вредны?

Именно из-за возможных конструкций типа
char* str = (LPTSTR)(LPCTSTR)some_text;
strcpy(str, "Hello, World!");


Вообще то однозначно принято что раз не const, значит на запись. Более другие случаи обычно оговариваются отдельно.
А автор может потому и молчит, что отлаживается?

-Вась, лови топор!
-Что молчишь? Поймал?



S>Вообще-то в 7-й студии

S>
S>typedef ATL::CStringT< TCHAR, StrTraitMFC< TCHAR > > CString;
S>

S>Так, что с юникодом, я думаю, библиотека справится нормально.

И какое собст. это имеет отношение в случае приведения к char*?
Вот еже ли бы было к TCHAR* тогда да. И 7-я студия тут не при чем.
Почетный кавалер ордена Совка.
Re[6]: Господа, хватит давать вредоносные советы
От: Saddam Россия http://saddam.narod.ru
Дата: 17.07.03 08:35
Оценка:
Здравствуйте, Patalog, Вы писали:

S>>Может спросить у создавшего тему, для чего ему char *? Для записи, или чтения? Что-то он молчит.

S>>Интересно, почем-же такие советы вредны?

P>Именно из-за возможных конструкций типа

P>
P>char* str = (LPTSTR)(LPCTSTR)some_text;
P>strcpy(str, "Hello, World!");
P>

Нууу... Для этого надо быть полным идиотом
Тем более, что:
some_text="Hello, World!";

Работает куда лучше.
Собственно, запись char * в CString, ИМХО, так и делается
P>Вообще то однозначно принято что раз не const, значит на запись. Более другие случаи обычно оговариваются отдельно.
Кем принято? То есть, если функция возвращает char *, то можно сделать так:
char * somefunc();
....
strcpy (somefunc(),pConstChar);



P>А автор может потому и молчит, что отлаживается?

Следуя всем советам по очереди
S>>Вообще-то в 7-й студии
S>>
S>>typedef ATL::CStringT< TCHAR, StrTraitMFC< TCHAR > > CString;
S>>

S>>Так, что с юникодом, я думаю, библиотека справится нормально.

P>И какое собст. это имеет отношение в случае приведения к char*?

Есть такой define — _UNICODE — если он стоит — то TCHAR = wchar_t, то есть Unicode ваш любимый, по крайней мере, я так понял из MSDN.
А вообще — в моей работе, например, главное, чтобы текст прочесть можно было
- Вы знаете — жаль, просто по-человечески жаль Памелу Андерсон, которая никогда не сможет сыграть на баяне...
Re[8]: Господа, хватит давать вредоносные советы
От: Saddam Россия http://saddam.narod.ru
Дата: 17.07.03 10:21
Оценка:
Здравствуйте, Patalog, Вы писали:

S>>Тем более, что:

S>>S>>some_text="Hello, World!";


S>>Работает куда лучше.

S>>Собственно, запись char * в CString, ИМХО, так и делается

P>Как так?

Operator = для CString описан с параметром cahr *

P>>>Вообще то однозначно принято что раз не const, значит на запись. Более другие случаи обычно оговариваются отдельно.


S>>Кем принято? То есть, если функция возвращает char *, то можно сделать так:

S>>S>>char * somefunc();
S>>....
S>>strcpy (somefunc(),pConstChar);


S>>


P>Да, именно это подразумевается. Напр. strdup.

После этого strdup-леный кусок памяти умирает в memory leak

S>>>>Так, что с юникодом, я думаю, библиотека справится нормально.


P>>>И какое собст. это имеет отношение в случае приведения к char*?


S>>Есть такой define — _UNICODE — если он стоит — то TCHAR = wchar_t, то есть Unicode ваш любимый, по крайней мере, я так понял из MSDN.


P>Ну и? Праально, получится wchar_t*. Но, повторюсь, какое отношение это имеет к char*?

LPCTSTR — An LPCWSTR if UNICODE is defined, an LPCSTR otherwise.
Считаю UNICODE раздел спора закрытым
S>>А вообще — в моей работе, например, главное, чтобы текст прочесть можно было

P>Сильно. А какой текст имеется в виду?

Тот, который в CString , чтобы после обратного преобразования я получил то-же результат.
P>А вообще, какая бы ни была работа, делать нужно правильно, и стараться не разбрасывать себе же под ноги грабли. Это даже если не учитывать, что возможно твой код будут сопровождать другие.
Внутрь "сопровождаемого" кода лезть не обязательно, и даже не желательно, особенно, если класс написан правильно. Я очень редко попадал в ситуации, когда мне приходилось править VCL-библиотеку. MFC — ни разу. И как они там внутри написаны — меня, честно говоря, не особо интересует. Главное — чтобы работали.
- Вы знаете — жаль, просто по-человечески жаль Памелу Андерсон, которая никогда не сможет сыграть на баяне...
Re[9]: Господа, хватит давать вредоносные советы
От: Patalog Россия  
Дата: 17.07.03 10:47
Оценка:
Здравствуйте, Saddam, Вы писали:

[]

S>Operator = для CString описан с параметром cahr *


И? Какое отношение это имеет к рассматриваемому вопросу?

[]

P>>Да, именно это подразумевается. Напр. strdup.


S>После этого strdup-леный кусок памяти умирает в memory leak


С чего это бы? free, батенька, забывать не нужно.
const char* text = "12340";
char* new_text = strdup(text);
strcpy(new_text, "5678");
free(new_text);


S>>>>>Так, что с юникодом, я думаю, библиотека справится нормально.


P>>>>И какое собст. это имеет отношение в случае приведения к char*?


S>>>Есть такой define — _UNICODE — если он стоит — то TCHAR = wchar_t, то есть Unicode ваш любимый, по крайней мере, я так понял из MSDN.


P>>Ну и? Праально, получится wchar_t*. Но, повторюсь, какое отношение это имеет к char*?


S>LPCTSTR — An LPCWSTR if UNICODE is defined, an LPCSTR otherwise.

S>Считаю UNICODE раздел спора закрытым

Млин, ну попробуй наконец
CString w_text(L"text");
char* n_text = LPCTSRT(w_text);

при включенном UNICODE и посмотри чего скажет компилятор.
Чего доказать то пытаешься?

И как они там внутри написаны — меня, честно говоря, не особо интересует.

И зря. Вот и посмотрел бы как тот же CStringT::operator=(const char*) реализуется.
Полезно весьма бывает.
Почетный кавалер ордена Совка.
Re[6]: Господа, хватит изображать из себя крутых
От: SWW Россия  
Дата: 17.07.03 10:48
Оценка:
ДН>И как это вам помогает в случае unicode? CString то будет содержать TCHAR == WCHAR, но кастом LPCTSTR вы char* не получите!

Человек задал элементарный вопрос. Ответна него такой: туда, где требуется char* необходимо написать саму строку, блягодаря чему неявно вызовется operator(LPCTSTR) класса CString. Наверняка требовалость именно это, потому что пихать строку туда, где требуется неконстантный char* никому не придет в голову.

Что касается UNICODE (о котором, вообще-то, никто не спрашивал) то если бы приложение было бы юникодным, то тогда и преобразовывать пришлось бы в WCHAR* и вопрос был бы задан соответственно.
Re[7]: Господа, хватит изображать из себя крутых
От: Patalog Россия  
Дата: 17.07.03 11:01
Оценка:
Здравствуйте, SWW, Вы писали:

хъ

SWW>Человек задал элементарный вопрос. Ответна него такой: туда, где требуется char* необходимо написать саму строку, блягодаря чему неявно вызовется operator(LPCTSTR) класса CString.


Ну и? Ответ не правильный ибо
CString str("Some text");
char* s = str;

даст (для VC 7.0)

error C2440: 'initializing' : cannot convert from 'ATL::CString' to 'char *

в отличии от
CString str("Some text");
const char* s = str;


SWW>Наверняка требовалость именно это, потому что пихать строку туда, где требуется неконстантный char* никому не придет в голову.


Реальность данная мне в ощущениях говорит обратное.

SWW>Что касается UNICODE (о котором, вообще-то, никто не спрашивал) то если бы приложение было бы юникодным, то тогда и преобразовывать пришлось бы в WCHAR* и вопрос был бы задан соответственно.


Ежели не даны уточняющие моменты следует исходить из общих предпосылок.
Почетный кавалер ордена Совка.
Re[3]: CString to char *
От: godwizard Россия  
Дата: 18.07.03 09:03
Оценка:
Всем привет !
Бурно вы тут разглагольствовали

Значит, дело в следующем: у меня есть функция function(char *, int, int) в dll.
в exe-шнике я ее вызываю, а 1-й параметр у меня в exe-шнике CString.
если я просто туда поставлю, пишет ошибку. Если СЫекштпюПуеИгааук(), то передается бред полный. Вот собсно и причина. Только ответа конкретно я не увидел (может смотрел плохо .
Best regards
Re[4]: CString to char *
От: Saddam Россия http://saddam.narod.ru
Дата: 18.07.03 09:56
Оценка:
Здравствуйте, godwizard, Вы писали:

G>Всем привет !

G>Бурно вы тут разглагольствовали

G>Значит, дело в следующем: у меня есть функция function(char *, int, int) в dll.

G>в exe-шнике я ее вызываю, а 1-й параметр у меня в exe-шнике CString.
G>если я просто туда поставлю, пишет ошибку. Если СЫекштпюПуеИгааук(), то передается бред полный. Вот собсно и причина. Только ответа конкретно я не увидел (может смотрел плохо .
Она у тебя что-нибудь в этот char * возвращает?
если нет (LPSTR)(LPCSTR). Если да — я-бы сделал динамически массив — передал туда, потом присвоил-бы CString-у и убил.
- Вы знаете — жаль, просто по-человечески жаль Памелу Андерсон, которая никогда не сможет сыграть на баяне...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.