|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Сетевые адаптеры в системе
Здравствуйте!
Конечно, я не хочень разбираюсь в новом Delphi XE2. Там много изменилось. Вот мне не понятна ещё одна вещь. Был взят код Александра (Rouse_) Багеля который должен показывать информацию о установленных сетевых интерфейсах. Я его немного переделал под себя (поубирал лишнее, изменил). Но он не хочет работать в Delphi XE2 (и оригинал и мой изменненыйй), хотя в Delphi 7 все ок было. Ниже я скину изменненый код, подскажите пожалуйста в чем может быть проблема и как её решить. Спасибо! Код:
unit uMain; interface uses Windows, SysUtils, Classes, Controls, Forms, ComCtrls, Messages, Variants, Graphics, Dialogs, StdCtrls, Buttons, ExtCtrls, ImgList; const MAX_ADAPTER_NAME_LENGTH = 256; MAX_ADAPTER_DESCRIPTION_LENGTH = 128; MAX_ADAPTER_ADDRESS_LENGTH = 8; IPHelper = 'iphlpapi.dll'; // Типы адаптеров MIB_IF_TYPE_OTHER = 1; MIB_IF_TYPE_ETHERNET = 6; MIB_IF_TYPE_TOKENRING = 9; MIB_IF_TYPE_FDDI = 15; MIB_IF_TYPE_PPP = 23; MIB_IF_TYPE_LOOPBACK = 24; MIB_IF_TYPE_SLIP = 28; type // Структуры для выполнения GetAdaptersInfo time_t = Longint; IP_ADDRESS_STRING = record S: array [0..15] of Char; end; IP_MASK_STRING = IP_ADDRESS_STRING; PIP_MASK_STRING = ^IP_MASK_STRING; PIP_ADDR_STRING = ^IP_ADDR_STRING; IP_ADDR_STRING = record Next: PIP_ADDR_STRING; IpAddress: IP_ADDRESS_STRING; IpMask: IP_MASK_STRING; Context: DWORD; end; PIP_ADAPTER_INFO = ^IP_ADAPTER_INFO; IP_ADAPTER_INFO = record Next: PIP_ADAPTER_INFO; ComboIndex: DWORD; AdapterName: array [0..MAX_ADAPTER_NAME_LENGTH + 3] of Char; Description: array [0..MAX_ADAPTER_DESCRIPTION_LENGTH + 3] of Char; AddressLength: UINT; Address: array [0..MAX_ADAPTER_ADDRESS_LENGTH - 1] of BYTE; Index: DWORD; Type_: 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: time_t; LeaseExpires: time_t; end; TfrmEnumNetInterfaces = class(TForm) tvInterfaces: TTreeView; procedure FormCreate(Sender: TObject); private procedure ReadLanInterfaces; end; // При помощи данной функции мы определим наличие сетевых интерфейсов // на локальном компьютере и информацию о них function GetAdaptersInfo(pAdapterInfo: PIP_ADAPTER_INFO; var pOutBufLen: ULONG): DWORD; stdcall; external IPHelper; var frmEnumNetInterfaces: TfrmEnumNetInterfaces; implementation {$R *.dfm} // Читаем все IP адреса со всех присутствующих // в системе сетевых интерфейсов procedure TfrmEnumNetInterfaces.ReadLanInterfaces; function MACToStr(Addr: array of Byte; Len: Integer): String; var I: Integer; begin if Len = 0 then Result := '00-00-00-00-00-00' else begin Result := ''; for I := 0 to Len - 2 do Result := Result + IntToHex(Addr[i], 2) + '-'; Result := Result + IntToHex(Addr[Len - 1], 2); end; end; var InterfaceInfo, TmpPointer: PIP_ADAPTER_INFO; Len: ULONG; AdapterTree, IPAddrTree, DHCPTree, WinsTree: TTreeNode; begin // Смотрим сколько памяти нам требуется? if GetAdaptersInfo(nil, Len) = ERROR_BUFFER_OVERFLOW then begin // Берем нужное кол-во GetMem(InterfaceInfo, Len); try // выполнение функции if GetAdaptersInfo(InterfaceInfo, Len) = ERROR_SUCCESS then begin // Перечисляем все сетевые интерфейсы TmpPointer := InterfaceInfo; repeat // Имя сетевого интерфейса AdapterTree := tvInterfaces.Items.Add(nil, 'Адаптер: ' + TmpPointer^.Description); // МАС Адрес tvInterfaces.Items.AddChild(AdapterTree, 'МАС: ' + MACToStr(TmpPointer^.Address, TmpPointer^.AddressLength)); // определение активности DHCP if Boolean(TmpPointer^.DhcpEnabled) then begin DHCPTree := tvInterfaces.Items.AddChild(AdapterTree, 'DHCP: Вкл.'); end else tvInterfaces.Items.AddChild(AdapterTree, 'DHCP: Выкл.'); // Windows Internet Name Service if TmpPointer^.HaveWins then begin WinsTree := tvInterfaces.Items.AddChild(AdapterTree, 'WINS: Вкл.'); end else tvInterfaces.Items.AddChild(AdapterTree, 'WINS: Выкл.'); TmpPointer := TmpPointer.Next; until TmpPointer = nil; end; finally // Освобождаем занятую память FreeMem(InterfaceInfo); end; end; end; procedure TfrmEnumNetInterfaces.FormCreate(Sender: TObject); begin ReadLanInterfaces; end; end. |
#2
|
||||
|
||||
Обрати внимание на выделенное цветом:
Код:
PIP_ADAPTER_INFO = ^IP_ADAPTER_INFO; IP_ADAPTER_INFO = record Next: PIP_ADAPTER_INFO; ComboIndex: DWORD; AdapterName: array [0..MAX_ADAPTER_NAME_LENGTH + 3] of AnsiChar; Description: array [0..MAX_ADAPTER_DESCRIPTION_LENGTH + 3] of AnsiChar; AddressLength: UINT; Address: array [0..MAX_ADAPTER_ADDRESS_LENGTH - 1] of BYTE; Index: DWORD; Type_: 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: time_t; LeaseExpires: time_t; end; Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |