Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как вывести в ListBox Ip всех "DhcpServer", Вывести в ListBox все адреса DhcpServer  
V
    Опции темы
sprus80
Дата 4.10.2009, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 4.10.2009

Репутация: нет
Всего: нет



Здраствуйте уважаймые пользователи Форума. 


Можно ли вывести в компонент ListBox сведения об всех найденных "DhcpServer" используя IPHelper = 'iphlpapi.dll', поиски исходников и тем на это результата не дал , а в Делфи я ещё новичёк. Просьба указать нужное направление поиска. 


Это сообщение отредактировал(а) sprus80 - 4.10.2009, 23:27
PM MAIL   Вверх
kami
Дата 4.10.2009, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 6
Всего: 72



Список сетевых интерфейсов
тебе нужно
 
Код

DhcpServer: IP_ADDR_STRING;

которая содержит все DhcpServer-s сетевого интерфейса.

PM MAIL WWW   Вверх
sprus80
Дата 4.10.2009, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 4.10.2009

Репутация: нет
Всего: нет



Цитата
kami

Большое спасибо за ссылку но беда в том что я ещё не сталкивался с  компонентом ListBox и как с ним работать не знаю . Но попробую поэксперементировать.

PM MAIL   Вверх
Данкинг
Дата 4.10.2009, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 1
Всего: 130



Цитата(sprus80 @ 4.10.2009,  21:08)
Цитата
kami

Большое спасибо за ссылку но беда в том что я ещё не сталкивался с  компонентом ListBox и как с ним работать не знаю . Но попробую поэксперементировать.

Код

Listbox1.Items.Add('ssss');



Это сообщение отредактировал(а) Данкинг - 4.10.2009, 21:01


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
kami
Дата 4.10.2009, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 6
Всего: 72



Цитата(sprus80 @  4.10.2009,  20:08 Найти цитируемый пост)
 я ещё не сталкивался с  компонентом ListBox и как с ним работать не знаю . Но попробую поэксперементировать.

Разберись, как получать то, что нужно, а вывести - как сказал Данкинг - это не проблема. Как работать со связным списком IP_ADDR_STRING показано в коде после строки
Код

// перечисляем все IP адреса интерфейса.

Будут непонятные вопросы - спрашивай, попробуем понятно ответить smile

Это сообщение отредактировал(а) kami - 4.10.2009, 22:37
PM MAIL WWW   Вверх
sprus80
Дата 4.10.2009, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 4.10.2009

Репутация: нет
Всего: нет



Прочитав пост   Узнать локальніе IP
и прочитав пост Как узнать ОСНОВНОЙ ШЛЮЗ на своём компе

а также Блогодаря подсказкам   smile  kami и  : smile  Данкинг разобрался в том что мне нужно сделать. smile 

Привожу полученный мной код 
Критикуйте его

Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls, WinSock, ScktComp,
  Registry, WinInet;

const
  MAX_ADAPTER_NAME_LENGTH = 256;
  MAX_ADAPTER_DESCRIPTION_LENGTH = 128;
  MAX_ADAPTER_ADDRESS_LENGTH = 8;

type

  PIP_ADDRESS_STRING = ^IP_ADDRESS_STRING;
  IP_ADDRESS_STRING = array[0..15] of char;

  PIP_ADDR_STRING = ^IP_ADDR_STRING;
  IP_ADDR_STRING = record
    Next: PIP_ADDR_STRING;
    IpAddress: IP_ADDRESS_STRING;
    IpMask: IP_ADDRESS_STRING;
    Context: DWORD;
  end;

  PIP_ADAPTER_INFO = ^IP_ADAPTER_INFO;
  IP_ADAPTER_INFO = record
    Next: PIP_ADAPTER_INFO;
    ComboIndex: DWORD;
    AdapterName: array[1..MAX_ADAPTER_NAME_LENGTH + 4] of Char;
    Description: array[1..MAX_ADAPTER_DESCRIPTION_LENGTH + 4] of Char;
    AddressLength: UINT;
    Address: array[1..MAX_ADAPTER_ADDRESS_LENGTH] of byte;
    Index: DWORD;
    aType: UINT;
    DHCPEnabled: UINT;
    CurrentIPAddress: PIP_ADDR_STRING;
    IPAddressList: IP_ADDR_STRING;
    GatewayList: IP_ADDR_STRING;
    DHCPServer: IP_ADDR_STRING;
    HaveWINS: BOOL;
    PrimaryWINSServer: IP_ADDR_STRING;
    SecondaryWINSServer: IP_ADDR_STRING;
    LeaseObtained: LongInt;
    LeaseExpires: LongInt;
    SpareStuff: array [1..200] of char;
  end;

  PIPAdderessStruct = ^TIPAdderessStruct;
  TIPAdderessStruct = record
    IPAddress: string;
    IpMask: string;
    Context: DWord;
  end;

  PIPAdderessStructList = ^TIPAdderessStructList;
  TIPAdderessStructList = array of TIPAdderessStruct;

  TAdaptersStruct = record
    ComboIndex: DWord;
    AdapterName: string;
    Description: string;
    AddressLength: LongWord;
    Address: array of Byte;
    Index: DWord;
    aType: LongWord;
    DHCPEnabled: Cardinal;
    CurrentIPAddress: string;
    IPAddressList: TIPAdderessStructList;
    GatewayList: TIPAdderessStructList;
    DHCPServer: TIPAdderessStructList;
    HaveWINS: Boolean;
    PrimaryWINSServer: TIPAdderessStructList;
    SecondaryWINSServer: TIPAdderessStructList;
    LeaseObtained: LongInt;
    LeaseExpires: LongInt;
    SpareStuff: string;
  end;

  TAdaptersStructList = array of TAdaptersStruct;


  TForm1 = class(TForm)
    ListBox1: TListBox;
  protected
  public
    constructor Create(AOwner: TComponent); override;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function GetAdaptersInfo(pAdapterInfo: PIP_ADAPTER_INFO; pOutBufLen: PULONG): DWORD; stdcall;
  external 'Iphlpapi.dll' name 'GetAdaptersInfo';

function NetApiBufferFree(pBuf: pByte): DWORD; stdcall;
  external 'Netapi32.dll' name 'NetApiBufferFree';


function GetIPAddrStringList(
  APIPAddrString: PIP_ADDR_STRING): TIPAdderessStructList;
var
  lPAddrSt: PIP_ADDR_STRING;
  lIndex: Integer;
begin
  Result := nil;
  lIndex := 0;
  if Assigned(APIPAddrString) then
  begin
    lPAddrSt := GetMemory(SizeOf(IP_ADDR_STRING));
    try
      lPAddrSt := APIPAddrString;
      repeat
        SetLength(Result, lIndex + 1);
        Result[lIndex].IPAddress := PChar(StrPas(@lPAddrSt^.IpAddress));
        Result[lIndex].IpMask := PChar(StrPas(@lPAddrSt^.IpMask));
        Result[lIndex].Context := lPAddrSt^.Context;
        lPAddrSt := lPAddrSt^.Next;
        Inc(lIndex);
      until lPAddrSt = nil;
    finally
      FreeMemory(lPAddrSt);
    end;
  end;
end;

function GetAdapterList: TAdaptersStructList;
var
  lOutBufLen: ULONG;
  lPAdapterInfo, lPNext: PIP_ADAPTER_INFO;
  lRes: DWORD;
  lCount: Integer;
  lIndex: Integer;
begin
  Result := nil;
  lCount := 1;
  lIndex := 0;

  repeat
    lRes := GetAdaptersInfo(nil, @lOutBufLen);
    lOutBufLen := SizeOf(IP_ADAPTER_INFO) * lCount;
    Inc(lCount);
  until (lRes = 0) or (lCount = 20);

  lPAdapterInfo := GetMemory(lOutBufLen);
  try
    ZeroMemory(lPAdapterInfo, lOutBufLen);
    GetAdaptersInfo(lPAdapterInfo, @lOutBufLen);

    lPNext := lPAdapterInfo;
    repeat
      SetLength(Result, lIndex + 1);
      Result[lIndex].ComboIndex := lPNext^.ComboIndex;
      Result[lIndex].AdapterName := PChar(Trim(StrPas(@lPNext^.AdapterName)));
      Result[lIndex].Description := PChar(Trim(StrPas(@lPNext^.Description)));
      Result[lIndex].AddressLength := lPNext^.AddressLength;

      SetLength(Result[lIndex].Address, Length(lPNext^.Address));
      CopyMemory(@lPNext^.Address, Result[lIndex].Address, Length(lPNext^.Address));

      Result[lIndex].Index := lPNext^.Index;
      Result[lIndex].aType := lPNext^.aType;
      Result[lIndex].DHCPEnabled := lPNext^.DHCPEnabled;

      Result[lIndex].CurrentIPAddress := PChar(StrPas(@lPNext^.CurrentIPAddress));
      Result[lIndex].IPAddressList := GetIPAddrStringList(@lPNext^.IPAddressList);

      Result[lIndex].GatewayList := GetIPAddrStringList(@lPNext^.GatewayList);
      Result[lIndex].DHCPServer := GetIPAddrStringList(@lPNext^.DHCPServer);
      Result[lIndex].HaveWINS := lPNext^.HaveWINS;
      Result[lIndex].PrimaryWINSServer := GetIPAddrStringList(@lPNext^.PrimaryWINSServer);
      Result[lIndex].SecondaryWINSServer := GetIPAddrStringList(@lPNext^.SecondaryWINSServer);
      Result[lIndex].LeaseObtained := lPNext^.LeaseObtained;
      Result[lIndex].LeaseExpires := lPNext^.LeaseExpires;
      Result[lIndex].SpareStuff := PChar(StrPas(@lPNext^.SpareStuff));
      lPNext:= lPNext^.Next;

      Inc(lIndex);
    until lPNext = nil;
  finally
    FreeMemory(lPAdapterInfo);
  end;
end;



{ TForm1 }

constructor TForm1.Create(AOwner: TComponent);
var
  lAdapterList: TAdaptersStructList;
  i, j: Integer;
begin
  inherited;
  lAdapterList := GetAdapterList;
  for i := Low(lAdapterList) to High(lAdapterList) do
  begin

    for j := Low(lAdapterList[i].DHCPServer) to High(lAdapterList[i].DHCPServer) do // Исправленно 
    ListBox1.Items.Add(lAdapterList[i].DHCPServer[j].IPAddress);
  end;
end;

end.



Теперь попробую разобрать исходник указанный kami и на примере полученных знаний переписать его

Это сообщение отредактировал(а) sprus80 - 5.10.2009, 00:06
PM MAIL   Вверх
kami
Дата 4.10.2009, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 6
Всего: 72



Цитата(sprus80 @  4.10.2009,  23:10 Найти цитируемый пост)
 
for j := Low(lAdapterList[i].IPAddressList) to High(lAdapterList[i].IPAddressList) do    
  ListBox1.Items.Add(lAdapterList[i].DHCPServer[j].IPAddress);

Вот единственное, что не пойму - почему цикл идет по массиву IP адресов структуры (по их количеству) а перечисляются DHCP серверы.....

Добавлено через 50 секунд
В общем случае можно поймать OutOfRange
PM MAIL WWW   Вверх
sprus80
Дата 4.10.2009, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 4.10.2009

Репутация: нет
Всего: нет



kami А вы правы что то я не так понял видно  
PM MAIL   Вверх
kami
Дата 4.10.2009, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 6
Всего: 72



Цитата(sprus80 @  4.10.2009,  23:42 Найти цитируемый пост)
что то я не так понял видно

На первый взгляд всё очень даже хорошо (на машине не запускал), посему единственное что нужно сделать - это в обозначенном выше цикле вместо Low(IPAddressList) и High(IPAddressList) поставить Low(DHCPServer) и High(DHCPServer)
PM MAIL WWW   Вверх
sprus80
Дата 4.10.2009, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 4.10.2009

Репутация: нет
Всего: нет



После того что вы указали мне на ошибку то подумал и исправил и попробовал на машине, работает как нужно. 
как я понял всё завязанно вот тут:
Код

lAdapterList: TAdaptersStructList


Код

TAdaptersStruct = record
    ComboIndex: DWord;
    AdapterName: string;
    Description: string;
    AddressLength: LongWord;
    Address: array of Byte;
    Index: DWord;
    aType: LongWord;
    DHCPEnabled: Cardinal;
    CurrentIPAddress: string;
    IPAddressList: TIPAdderessStructList;
    GatewayList: TIPAdderessStructList;
    DHCPServer: TIPAdderessStructList;
    HaveWINS: Boolean;
    PrimaryWINSServer: TIPAdderessStructList;
    SecondaryWINSServer: TIPAdderessStructList;
    LeaseObtained: LongInt;
    LeaseExpires: LongInt;
    SpareStuff: string;


Спасибо kami теперь буду думать дальше 

Это сообщение отредактировал(а) sprus80 - 5.10.2009, 00:04
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0826 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.