Конференция "Сети" » Проблема с gethostbyname
 
  • Separator © (28.01.10 09:53) [0]
    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;

  • Rouse_ © (28.01.10 20:48) [1]

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

    Ну если функция требует на вход анси, а ты ей юникод пихаешь, сам подумай, что она должна сделать?
  • Anatoly Podgoretsky © (28.01.10 21:43) [2]
    > Rouse_  (28.01.2010 20:48:01)  [1]

    Хуже будет, когда переменная объявлена как Wide/AnsiString, а на самом деле в ней Ansi/WideString, тут приведение не спасет, поскольку это не приведение, а преобразование
  • Separator © (29.01.10 08:41) [3]
    Во из msdn:

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



    Тут входящий параметр объявлен как char, в Delphi он будет аналогом AnsiChar или WideChar?
 
Конференция "Сети" » Проблема с gethostbyname
Есть новые Нет новых   [134438   +31][b:0][p:0.001]