Здравствуйте, RussianFellow, Вы писали:
RF>Как преобразовать CString в char* или в char[] ?
Канонично использовать GetBuffer()/ReleaseBuffer()
Если требуется именно неконстантная строка.
RF>У меня есть такой код:
RF>CString myString; RF>char s[30]; RF>int i, n;
RF>//...
RF>n = myString.GetLength(); RF>LPTSTR pzsText = (LPTSTR)(myString.GetBuffer(n)); RF>for (i=0; i<n; i++) s[i] = pszText[i]; RF>s[n] = '\0';
RF>Но нельзя ли написать проще? И чтобы работало для всех случаев, а не только для поддержки Юникода?
В данном случае логично написать
_tcscpy(s, myString.GetString());
_____________________
С уважением,
Stanislav V. Zudin
RF>n = myString.GetLength(); RF>LPTSTR pzsText = (LPTSTR)(myString.GetBuffer(n)); RF>for (i=0; i<n; i++) s[i] = pszText[i]; RF>s[n] = '\0';
RF>У меня стоит поддержка Юникод, поэтому этот код правильно работает.
Запусти свой код и сам увидишь, что работает всё неправильно, во-первых, выведет не то, что ты ждешь, во-вторых, код сам по себе падучий.
В (ATL)MFC с большой осторожностью в однопоточных приложениях можно использовать связку макросов USES_CONVERSION и W2A, или же во всех других случаях использовать WideCharToMultiByte
Там же во втором сообщении есть ответ на ваш вопрос.
RF>У меня есть такой код:
RF>CString myString; RF>char s[30]; RF>int i, n;
RF>//...
RF>n = myString.GetLength(); RF>LPTSTR pzsText = (LPTSTR)(myString.GetBuffer(n)); RF>for (i=0; i<n; i++) s[i] = pszText[i]; RF>s[n] = '\0';
Вообще какой-то треш, а не код, честно говоря.
По пунктам:
— Какие char s[30]?
— GetBuffer можно вызывать без аргумента, если требуется получить все символы
— Зачем это посимвольное копирование?
RF>У меня стоит поддержка Юникод, поэтому этот код правильно работает.
???
Может быть, MBCS?
Re[2]: Как преобразовать CString в char* (char[]) ?
Здравствуйте, b0r3d0m, Вы писали:
P>>В (ATL)MFC с большой осторожностью в однопоточных приложениях можно использовать связку макросов USES_CONVERSION и W2A
B>А что с ними не так в многопоточных?
Ну, это-то понятно, оно даже в документации описано:
The allocated space is automatically freed when the calling function exits (not when the allocation merely passes out of scope)
А вот с многопоточным кодом я всё же не понял...
Почитал доки alloca, но никаких упоминаний о multithreading'е там не встретил. У каждой нити исполнения ведь свой стек, в чём тогда может быть проблема? Пускай себе юзают alloca в недрах.
Re[6]: Как преобразовать CString в char* (char[]) ?
B>А вот с многопоточным кодом я всё же не понял...
B>Почитал доки alloca, но никаких упоминаний о multithreading'е там не встретил. У каждой нити исполнения ведь свой стек, в чём тогда может быть проблема? Пускай себе юзают alloca в недрах.
А, или вы о том, что аллоцируемый alloc'ом буфер нельзя юзать из другого потока? Ну, оно, в принципе, логично -- стек у каждого свой, очистится он может в любой непредсказуемый для другого потока момент etc.
Re[7]: Как преобразовать CString в char* (char[]) ?
B>А, или вы о том, что аллоцируемый alloc'ом буфер нельзя юзать из другого потока? Ну, оно, в принципе, логично -- стек у каждого свой, очистится он может в любой непредсказуемый для другого потока момент etc.
Я-то уж было подумал, что вызовы alloca непотокобезопасны.