Здравствуйте!
Конечно, я не хочень разбираюсь в новом 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.