Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с gethostbyname


Separator ©   (2010-01-28 09:53:00) 

Win7, D2101
Использую модуль JwaWinsock2
Нужно получить ip по названию.
Вот объявление: function gethostbyname(name: PChar): PHostEnt
PChar в 2010 это PWideChar
Так вот, никак не мог понять почему функция не хочет работать, не возвращает ipшники по названию. Решил проблему с приведением тип WideString к AnsString и тогда всё заработало.
Вопрос так и должно быть?
Код моей функции:

procedure GetIPs(const aList: TStrings; const aHostName: string = '');
type
 PPInAddr = ^TPInAddr;
 TPInAddr = array [0..250] of PInAddr;
var
 mHost: PHostEnt;
 mHostName: AnsiString;
 mAdress: PPInAddr;
 mWSAData: TWSADATA;
 i: Integer;
begin
 if aList <> nil then
 begin
   WSAStartup(C_WSA_VERSION, mWSAData);
{$WARNINGS OFF}
   if Length(aHostName) > 0 then
   begin
     mHostName := aHostName;
     mHost:= GetHostByName(PChar(mHostName));
   end
   else
   begin
     SetLength(mHostName, 128);
     GetHostName(PChar(mHostName), Length(mHostName));
     mHost:= GetHostByName(PChar(mHostName));
     SetLength(mHostName, 0);
   end;
{$WARNINGS ON}
   if mHost <> nil then
   begin
     mAdress := PPInAddr(mHost^.h_addr_list);
     i := 0;
     while mAdress[i] <> nil do
     begin
       aList.Add(N2IP(mAdress[i]^));
       Inc(i);
     end
   end;
   WSACleanup;
 end;
end;


Separator   (2010-01-29 08:41:00) [1]

Во из msdn:

struct hostent* FAR gethostbyname(
 __in  const char *name
);


Тут входящий параметр объявлен как char, в Delphi он будет аналогом AnsiChar или WideChar?


Anatoly Podgoretsky   (2010-01-28 21:43:00) [2]

> Rouse_  (28.01.2010 20:48:01)  [1]

Хуже будет, когда переменная объявлена как Wide/AnsiString, а на самом деле в ней Ansi/WideString, тут приведение не спасет, поскольку это не приведение, а преобразование


Rouse_   (2010-01-28 20:48:00) [3]


> Так вот, никак не мог понять почему функция не хочет работать,
>  не возвращает ipшники по названию. Решил проблему с приведением
> тип WideString к AnsString и тогда всё заработало.
> Вопрос так и должно быть?

Ну если функция требует на вход анси, а ты ей юникод пихаешь, сам подумай, что она должна сделать?


Наверх

Титульная страница Поиск, карта сайта Написать письмо