Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, godwizard, Вы писали:
G>>Как преобразовать CString в char *?
А>По-моему, если CString str; А>То str.GetBuffer(str.GetLength()); это оно и будет.
Который раз тут уже это спрашивают, и это отвечают
pChar=(LPCSTR)str;
- Вы знаете — жаль, просто по-человечески жаль Памелу Андерсон, которая никогда не сможет сыграть на баяне...
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, godwizard, Вы писали:
G>>Как преобразовать CString в char *?
А>По-моему, если CString str; А>То str.GetBuffer(str.GetLength()); это оно и будет.
Не забыв после этого обязательно вызвать str.ReleaseBuffer().
Здравствуйте, Дмитрий Наумов, Вы писали:
ДН>Здравствуйте, Mutabor, Вы писали:
S>>>>
S>>>> pChar=(LPCSTR)str;
S>>>>
ДН>>>а если TCHAR != char что делать то будем?...
M>>pChar=(LPCTSTR)str;
ДН>Ну блин, я ж не вчера родился. В ситуации, когда TCHAR != char ДН>делай приведение хоть в LPCSTR хоть LPCTSTR — char* из CString (а именно это и просилось человеком) не получишь. То есть все ваши ответы правильны, только не для UNICODE
Нууу.... Практика показывает, что почти все когда-то наступали на подобные грабли.
Тем более, что в столь утрированном варианет (выше) сие встречается довольно редко. Обычно все немного тоньше, типа:
S>Работает куда лучше. S>Собственно, запись char * в CString, ИМХО, так и делается
Как так?
P>>Вообще то однозначно принято что раз не const, значит на запись. Более другие случаи обычно оговариваются отдельно.
S>Кем принято? То есть, если функция возвращает char *, то можно сделать так: S>
Да, именно это подразумевается. Напр. strdup.
P>>А автор может потому и молчит, что отлаживается?
S>Следуя всем советам по очереди S>>>Вообще-то в 7-й студии S>>>
S>>>Так, что с юникодом, я думаю, библиотека справится нормально.
P>>И какое собст. это имеет отношение в случае приведения к char*?
S>Есть такой define — _UNICODE — если он стоит — то TCHAR = wchar_t, то есть Unicode ваш любимый, по крайней мере, я так понял из MSDN.
Ну и? Праально, получится wchar_t*. Но, повторюсь, какое отношение это имеет к char*?
S>А вообще — в моей работе, например, главное, чтобы текст прочесть можно было
Сильно. А какой текст имеется в виду?
А вообще, какая бы ни была работа, делать нужно правильно, и стараться не разбрасывать себе же под ноги грабли. Это даже если не учитывать, что возможно твой код будут сопровождать другие.
ДН>>а если TCHAR != char что делать то будем?...
M>pChar=(LPCTSTR)str;
Ну блин, я ж не вчера родился. В ситуации, когда TCHAR != char
делай приведение хоть в LPCSTR хоть LPCTSTR — char* из CString (а именно это и просилось человеком) не получишь. То есть все ваши ответы правильны, только не для UNICODE
Здравствуйте, Дмитрий Наумов, Вы писали:
ДН>Здравствуйте, 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.
}
а поскольку в исходном посте область применения явно не оговаривалась, следует исходить из предположения об общем случае применения.
И это применение, что явствует именно из char* (а не const char*) — буфер на запись. Поэтому подобные ответы мягко говоря некорректны, и более того потенциально опасны. Это даже если не касаться проблемы UNICODE, как правильно заметил Дмитрий.
Да, действительно, заданный вопрос не содержал никаких ограничений, поэтому общие ответы в стиле "...надо прикастить к ..." потенциально опасны. Patalog'у спасибо за поддержку!
Именно в этом случае получается бред. Сильно сомневаюсь, что LVITEM имеет готовый буфер под текст. P>а поскольку в исходном посте область применения явно не оговаривалась, следует исходить из предположения об общем случае применения. P>И это применение, что явствует именно из char* (а не const char*) — буфер на запись. Поэтому подобные ответы мягко говоря некорректны, и более того потенциально опасны. Это даже если не касаться проблемы UNICODE, как правильно заметил Дмитрий.
Может спросить у создавшего тему, для чего ему char *? Для записи, или чтения? Что-то он молчит.
Интересно, почем-же такие советы вредны?
Вообще-то в 7-й студии
S> Именно в этом случае получается бред. Сильно сомневаюсь, что LVITEM имеет готовый буфер под текст.
Да, забыл добавить, только в случае SetItem.
Вот видишь, ты уже сам понимаешь что некошерно так делать.
P>>а поскольку в исходном посте область применения явно не оговаривалась, следует исходить из предположения об общем случае применения. P>>И это применение, что явствует именно из char* (а не const char*) — буфер на запись. Поэтому подобные ответы мягко говоря некорректны, и более того потенциально опасны. Это даже если не касаться проблемы UNICODE, как правильно заметил Дмитрий.
S>Может спросить у создавшего тему, для чего ему char *? Для записи, или чтения? Что-то он молчит. S>Интересно, почем-же такие советы вредны?
Вообще то однозначно принято что раз не const, значит на запись. Более другие случаи обычно оговариваются отдельно.
А автор может потому и молчит, что отлаживается?
Здравствуйте, Patalog, Вы писали:
S>>Может спросить у создавшего тему, для чего ему char *? Для записи, или чтения? Что-то он молчит. S>>Интересно, почем-же такие советы вредны?
P>Именно из-за возможных конструкций типа P>
Нууу... Для этого надо быть полным идиотом
Тем более, что:
some_text="Hello, World!";
Работает куда лучше.
Собственно, запись char * в CString, ИМХО, так и делается P>Вообще то однозначно принято что раз не const, значит на запись. Более другие случаи обычно оговариваются отдельно.
Кем принято? То есть, если функция возвращает char *, то можно сделать так:
S>>Так, что с юникодом, я думаю, библиотека справится нормально.
P>И какое собст. это имеет отношение в случае приведения к char*?
Есть такой define — _UNICODE — если он стоит — то TCHAR = wchar_t, то есть Unicode ваш любимый, по крайней мере, я так понял из MSDN.
А вообще — в моей работе, например, главное, чтобы текст прочесть можно было
- Вы знаете — жаль, просто по-человечески жаль Памелу Андерсон, которая никогда не сможет сыграть на баяне...
Здравствуйте, 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 — ни разу. И как они там внутри написаны — меня, честно говоря, не особо интересует. Главное — чтобы работали.
- Вы знаете — жаль, просто по-человечески жаль Памелу Андерсон, которая никогда не сможет сыграть на баяне...
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 раздел спора закрытым
ДН>И как это вам помогает в случае unicode? CString то будет содержать TCHAR == WCHAR, но кастом LPCTSTR вы char* не получите!
Человек задал элементарный вопрос. Ответна него такой: туда, где требуется char* необходимо написать саму строку, блягодаря чему неявно вызовется operator(LPCTSTR) класса CString. Наверняка требовалость именно это, потому что пихать строку туда, где требуется неконстантный char* никому не придет в голову.
Что касается UNICODE (о котором, вообще-то, никто не спрашивал) то если бы приложение было бы юникодным, то тогда и преобразовывать пришлось бы в WCHAR* и вопрос был бы задан соответственно.
хъ
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");
constchar* s = str;
SWW>Наверняка требовалость именно это, потому что пихать строку туда, где требуется неконстантный char* никому не придет в голову.
Реальность данная мне в ощущениях говорит обратное.
SWW>Что касается UNICODE (о котором, вообще-то, никто не спрашивал) то если бы приложение было бы юникодным, то тогда и преобразовывать пришлось бы в WCHAR* и вопрос был бы задан соответственно.
Ежели не даны уточняющие моменты следует исходить из общих предпосылок.
Значит, дело в следующем: у меня есть функция function(char *, int, int) в dll.
в exe-шнике я ее вызываю, а 1-й параметр у меня в exe-шнике CString.
если я просто туда поставлю, пишет ошибку. Если СЫекштпюПуеИгааук(), то передается бред полный. Вот собсно и причина. Только ответа конкретно я не увидел (может смотрел плохо .
Здравствуйте, godwizard, Вы писали:
G>Всем привет ! G>Бурно вы тут разглагольствовали
G>Значит, дело в следующем: у меня есть функция function(char *, int, int) в dll. G>в exe-шнике я ее вызываю, а 1-й параметр у меня в exe-шнике CString. G>если я просто туда поставлю, пишет ошибку. Если СЫекштпюПуеИгааук(), то передается бред полный. Вот собсно и причина. Только ответа конкретно я не увидел (может смотрел плохо .
Она у тебя что-нибудь в этот char * возвращает?
если нет (LPSTR)(LPCSTR). Если да — я-бы сделал динамически массив — передал туда, потом присвоил-бы CString-у и убил.
- Вы знаете — жаль, просто по-человечески жаль Памелу Андерсон, которая никогда не сможет сыграть на баяне...