Консультация № 135289
04.05.2008, 15:18
0.00 руб.
0 1 1
В следующем куске кода

int size = recvfrom(s,(char*)recvbuf,64,0,(SOCKADDR *)&saddr,&saddrsize);
if (size != -1) {
if (MessageBox(hWnd,(LPCWSTR)inet_ntoa(saddr.sin_addr),L"Сообщение",MB_YESNO)==IDYES)
SendMessageW(hEditWnd,WM_SETTEXT,0,(LPARAM)recvbuf);

в мэсседжбоксе слово "сообщение" нормально отображается, а IP-адрес в виде квадратиков, как это бывает в случае неправильной кодировки. В чем дело?

Обсуждение

Неизвестный
04.05.2008, 15:42
общий
это ответ
Здравствуйте, Blackie!
Дело в том, что функция inet_ntoa возвращает строку с адресом в виде ANSI строки (char*). С помощью явного преобразования (LPCWSTR) перевести строку в UNICODE не получится - буфер сос трокой останется тем же, только вместо одного байта за символ будет считаться 2 (или больше). Надо использовать вспомогательные функции или макросы для преобразования.
Например, A2CW (Ansi string to(2) Const Wide string):
MessageBox(hWnd,A2CW(inet_ntoa(saddr.sin_addr)),L"Сообщение",MB_YESNO);

Для работы макросов необходимо подключить заголовочный файл <atlconv.h>. Так же для некоторых макросов в тело функции, их использующей, вписать макрос USES_CONVERSION;.

ps: раз уж вы в явном виде работаете с UNICODE строками, то лучше использовать UNICODE версии функций, например MessageBoxW. В этом случае, независимо от настроек компилятора (тип строк по умолчанию), все будет работать корректно.
Форма ответа