Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.10.2012, 22:57   #1
malor
Форумчанин
 
Регистрация: 23.05.2007
Сообщений: 151
Вопрос GetNameInfo() выдает мусор вместо IP хоста



Код:
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;
Почему такое содержимое у переменной `host` ?

Delphi XE / Windows 7 SP1 64-bit
Изображения
Тип файла: jpg GetNameInfo_Garbage_IP.jpg (53.5 Кб, 125 просмотров)
Вложения
Тип файла: zip GetAdaptersAddresses-GetNameInfo_2110_[2].zip (129.6 Кб, 11 просмотров)
malor вне форума Ответить с цитированием
Старый 22.10.2012, 00:44   #2
kangreon
Форумчанин
 
Аватар для kangreon
 
Регистрация: 03.04.2009
Сообщений: 305
По умолчанию

Судя по описанию на MSDN следует использовать PAnsiChar.
Или можно воспользоваться функцией GetNameInfoW
Я думаю, что проблема в этом.
kangreon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++ >> fstream >> Мусор -_- Katus Помощь студентам 2 03.05.2012 22:50
Мусор в памяти monro86 Visual C++ 0 10.04.2012 15:04
создание виртуального хоста Dimarik PHP 8 10.07.2010 22:02
мусор в UNICODE X-954377 Общие вопросы C/C++ 2 04.07.2010 15:12
вместо номера телефона выводится на экран какой-то мусор le_den Общие вопросы C/C++ 2 25.11.2008 20:45