Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: GetNameInfo() выдает мусор вместо IP хоста (инфа от GetAdaptersAddresses())  (Прочитано 8062 раз)
0 Пользователей и 1 Гость смотрят эту тему.
malor
Опытный

ru
Offline Offline

« : 21-10-2012 19:03 » 



Почему содержимое в виде иероглифов внутри переменной `host` ?

Код: (Delphi)
function GetAdaInfo2(out AInfoStr: AnsiString; const AOnlyMac: Boolean):Boolean;
NI_MAXHOST = 1025;
NI_MAXSERV = 32;
NI_NUMERICHOST = $2;
NI_NUMERICSERV = $8;

var
  i: Integer;
  bf: Cardinal;
  LpAdapterAddresses: PIP_ADAPTER_ADDRESSES;

  //*********************
  host, serv: String;
  hostlen, servlen: integer;
  r: integer;
  m_data: WSADATA;
begin
  if WSAStartup($0202, m_data) <> 0 then
    Exit;

  bufferSize := sizeof(text);

  Result := True;
  AInfoStr := '';
  try
    bf := 0;
    if GetAdaptersAddresses(0, 0, nil, nil, @bf) <> ERROR_BUFFER_OVERFLOW then Abort;
    try
      GetMem(LpAdapterAddresses, bf);
      if GetAdaptersAddresses(0, 0, nil, LpAdapterAddresses, @bf) <> ERROR_SUCCESS then Abort;

      while LpAdapterAddresses <> nil do
      begin
        try

            //********************************************************************

            hostlen := NI_MAXHOST;     // 1025
            servlen := NI_MAXSERV;     // 32
            setlength(host, hostlen);
            setlength(serv, servlen);

            r := GetNameInfo(LpAdapterAddresses.FirstUnicastAddress.Address.lpSockaddr,
                             LpAdapterAddresses.FirstUnicastAddress.Address.iSockaddrLength,
                             PWideChar(host), hostlen,
                             PWideChar(serv), servlen, NI_NUMERICHOST);  // NI_NUMERICSERV


            //********************************************************************

        finally
          LpAdapterAddresses := LpAdapterAddresses^.Next;
        end;
      end;
    finally
      FreeMem(LpAdapterAddresses, bf);
    end;
  except
    Result := False;
  end;

  WSACleanup;

end;

Delphi XE / Windows 7 SP1 64-bit

* GetAdaptersAddresses-GetNameInfo_2110_[2].zip (129.61 Кб - загружено 850 раз.)
Записан
zubr
Гость
« Ответ #1 : 22-10-2012 07:20 » new

Как у тебя определена GetNameInfo?
Записан
malor
Опытный

ru
Offline Offline

« Ответ #2 : 22-10-2012 08:34 » 

Заработала при таком написании:
Код: (Delphi)
  host, serv: WideString;
  hostlen, servlen: integer;
  r: integer;

  IP: WideString;
...............
...............

          r :=  GetNameInfoW(LpAdapterAddresses.FirstUnicastAddress.Address.lpSockaddr,
                              LpAdapterAddresses.FirstUnicastAddress.Address.iSockaddrLength,
                              PWideChar(host), hostlen,
                              PWideChar(serv), servlen, NI_NUMERICHOST);  // NI_NUMERICSERV

          if r = 0 then
            IP := PWideChar(host);

Определена в разделе type сейчас как:
  function  GetNameInfoW(sa: PSockAddr; salen: DWORD; host: PChar; hostlen: DWORD; serv: PChar; servlen: DWORD; flags: Integer): Integer; stdcall; external 'ws2_32.dll' name 'GetNameInfoW';
Записан
v2
Помогающий

ua
Offline Offline

« Ответ #3 : 22-10-2012 19:08 » 

Для XE+
Цитата
Note: The default string type is UnicodeString. WideString is provided to be compatible with the COM BSTR type. You should generally use UnicodeString for non-COM applications; for most purposes UnicodeString is the preferred type. The type string is an alias for UnicodeString.

-> для winapi xxxW функций.
 WideString -> UnicodeString -> String
 PWideChar -> PChar
-> для winapi xxxА функций.
 AnsiString
 PAnsiChar

ЗЫ.
В XE+ в объявлении некоторых winapiA встречаются ошибки -> остался старый PChar, который забыли заменить на PAnsiChar.
А в XE2+ (64bit) в объявлении некоторых winapi остался DWORD/Cardinal/Integer там где нужно NativeUInt/NativeInt

Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines