Здравствуйте, MAPCUAHUH, Вы писали:
MAP> Как перевести из WCHAR* в char*?
WideCharToMultiByte()/wcstombs()
[ posted via RSDN@Home 1.1.4 beta 7 r501, accompanied by Metallica — The Unforgiven ]
Здравствуйте, MAPCUAHUH, Вы писали:
MAP>Здраствуйте,
MAP> Как перевести из WCHAR* в char*?
Это смотря что у тебя по этому указателю хранится...
Ну предположим, что строка. Тогда так
1) MS-specific — WideCharToMultiByte
// начальные условия
WCHAR const* src_string;
UINT dst_codepage; // CP_ACP - дефолтное, CP_UTF8 и т.п.
DWORD const flags = 0; // читай документацию
int dst_length = WideCharToMultiByte(dst_codepage, flags, src_string, -1, NULL, 0, NULL, NULL); // получил размер
char* dst_string = new char[dst_length+1]; // выделил память своим любимым способом
WideCharToMultiByte(dst_codepage, flags, src_string, -1, dst_string, dst_length+1, NULL, NULL); // преобразовал
2) STD C — wcstombs + пляски с locale
wchar_t const* src_string;
size_t dst_length = wcstombs(NULL,src_string,0);
char* dst_string = new char[dst_length+1];
wcstombs(dst_string,src_string,0);
3) libiconv — iconv_open, iconv, iconv_close (см.
http://www.gnu.org/software/libiconv/)
Здравствуйте, MAPCUAHUH, Вы писали:
MAP>Здраствуйте,
MAP> Как перевести из WCHAR* в char*?
В ATL есть String Conversion Macros.
A2BSTR OLE2A T2A W2A
A2COLE OLE2BSTR T2BSTR W2BSTR
A2CT OLE2CA T2CA W2CA
A2CW OLE2CT T2COLE W2COLE
A2OLE OLE2CW T2CW W2CT
A2T OLE2T T2OLE W2OLE
A2W OLE2W T2W W2T
Это просто сказка. Конвертирование выполяется примерно так.
void func( LPSTR lpsz )
{
USES_CONVERSION;
...
LPWSTR x =
A2W(lpsz)
// Do something with x
...
}
Если можно использовать ATL, то рекомендую.
... << RSDN@Home 1.1.4 stable rev. 510>>
Здравствуйте, Ka3a4oK, Вы писали:
KK>Здравствуйте, MAPCUAHUH, Вы писали:
<>
KK>Это просто сказка. Конвертирование выполяется примерно так.
Сказка, то сказка ... но, к примеру:
#define A2W(lpa) (\
((_lpa = lpa) == NULL) ? NULL : (\
_convert = (lstrlenA(_lpa)+1),\
ATLA2WHELPER((LPWSTR) alloca(_convert*2), _lpa, _convert, _acp)))
так шта в циклах которые будут выполняться много раз использовать нельзя — stack overflow однако

.
Это я к тому что на эти грабли наступал и долго не мог понять в чем дело, пока в макрос не заглянул
Может кого-то спасет от пары часов нудного дебага
Best regards,
jedi
Здравствуйте, jedi, Вы писали:
J>Сказка, то сказка ... но, к примеру:
J>J>#define A2W(lpa) (\
J> ((_lpa = lpa) == NULL) ? NULL : (\
J> _convert = (lstrlenA(_lpa)+1),\
J> ATLA2WHELPER((LPWSTR) alloca(_convert*2), _lpa, _convert, _acp)))
J>
J>так шта в циклах которые будут выполняться много раз использовать нельзя — stack overflow однако
.
В ATL 7.0 починили:
The new conversion classes which require a buffer (CA2AEX, CA2WEX, CW2AEX, and CW2WEX) use a fixed-size static buffer to store the result of the conversion. If the result is too large to fit into the static buffer, the class allocates memory using malloc, freeing the memory when the object goes out of scope. This ensures that, unlike the older text conversion macros, these classes are safe to use in loops and won't overflow the stack.
И вот сравнение:
Old ATL 3.0 Conversion Macros New ATL 7.0 Conversion Classes
Allocates memory on the stack. Uses stack memory for small strings.
Uses the heap if the stack is not large enough.
The string is freed when the function The string is freed when the variable goes out of scope.
is exited.
Cannot be used in exception handlers. Can be used in exception handlers.
Not suitable for use in loops. Supports use in loops. Loop scope ensures that memory is
Memory use grows until the function is freed on each iteration.
exited.
Not good for large strings. Stack space No problems with large strings. Strings will be
is limited. allocated on the heap.
Usually require USES_CONVERSION to be Never require USES_CONVERSION to be defined.
defined.
Meaning of OLE depends on definition of OLE is always equivalent to W.
OLE2ANSI.
Здравствуйте, Нахлобуч, Вы писали:
<>
Ключевое слово:
New ATL 7.0 Conversion Classes — а макросы остались старые (тот что я приводил как раз из ATL 7.0). Так что вывод очевидный — не юзать макросы at all if its possible