Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.30;
Скачать: CL | DM;

Вниз

Перечислить сет. интерфейсы, Как?   Найти похожие ветки 

 
bloodman ©   (2006-01-12 19:47) [0]

Как пройтись по всем сетевым карточкам в компьютере? Мне нужно узнать все ip адреса компьютера на котором запущена программа, желательно, не просто списком, а чтобы можно было определить какой сетевой карте эти адреса принадлежат??
Спасибо.


 
Rouse_ ©   (2006-01-13 12:05) [1]

type
 USHORT = WORD;
 ULONG = DWORD;
 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;

 function GetAdaptersInfo(pAdapterInfo: PIP_ADAPTER_INFO;
   var pOutBufLen: ULONG): DWORD; stdcall; external IPHelper;

procedure TfrmMain.ReadLanInterfaces;
var
 InterfaceInfo,
 TmpPointer: PIP_ADAPTER_INFO;
 IP: PIP_ADDR_STRING;
 Len: ULONG;
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
         IP := @TmpPointer.IpAddressList;
         repeat
           cbInterfaces.Items.Add(Format("%s - [%s]",
             [IP^.IpAddress.S, TmpPointer.Description]));
           IP := IP.Next;
         until IP = nil;
         TmpPointer := TmpPointer.Next;
       until TmpPointer = nil;
     end;
   finally
     FreeMem(InterfaceInfo);
   end;
 end;
 if cbInterfaces.Items.Count = 0 then
 begin
   memReport.Text := "Сетевые интерфейсы не обнаружены." + sLineBreak +
     "Продолжение работы программы не возможно.";
   btnStartStop.Enabled := False;
   Exit;
 end
 else
   cbInterfaces.ItemIndex := 0;
end;


 
Rouse_ ©   (2006-01-13 12:07) [2]

Если нужны имена виртуальных устройств, то подход несколько иной:

const
 MAX_ADAPTER_NAME       = 255;
type
 PIP_ADAPTER_INDEX_MAP = ^IP_ADAPTER_INDEX_MAP;
 IP_ADAPTER_INDEX_MAP = record
    Index: DWORD;
    Name: array [0..MAX_ADAPTER_NAME-1] of WideChar;
 end;

 PIP_INTERFACE_INFO = ^IP_INTERFACE_INFO;
 IP_INTERFACE_INFO = record
    NumAdapters: Longint;
    Adapter: array [0..0] of IP_ADAPTER_INDEX_MAP;
 end;

 function GetIfEntry(pIfRow: PMibIfRow): DWORD; stdcall external "iphlpapi.dll";
 function GetNumberOfInterfaces(var pdwIntf: DWORD): DWORD; stdcall; external "iphlpapi.dll";
 function GetInterfaceInfo(pIfTable: PIP_INTERFACE_INFO; var dwOutBufLen:DWORD): DWORD;
   stdcall; external "iphlpapi.dll";
 function GetAdapterIndex(AdapterName: PWideChar; var IfIndex: DWORD): DWORD;
   stdcall; external "iphlpapi.dll";

procedure TMainForm.Button1Click(Sender: TObject);
var
 I, pdwIntf, dwOutBufLen, IfIndex: DWORD;
 lpInfo: PIP_INTERFACE_INFO;
 mirIfDescr: TMibIfRow;
begin
 //if GetNumberOfInterfaces(pdwIntf) = NO_ERROR then
 //begin
   GetInterfaceInfo(nil, dwOutBufLen);
   GetMem(lpInfo, dwOutBufLen);
   try
     if GetInterfaceInfo(lpInfo, dwOutBufLen) = NO_ERROR then
     begin
       for I := 0 to lpInfo^.NumAdapters - 1 do
       begin
         Memo1.Lines.Add("AdapterName: " + lpInfo^.Adapter[I].Name);
         if GetAdapterIndex(lpInfo^.Adapter[I].Name, IfIndex) = NO_ERROR then
           Memo1.Lines.Add("AdapterIndex: " + IntToStr(IfIndex))
         else
           RaiseLastOSError;
         ZeroMemory(@mirIfDescr, SizeOf(TMibIfRow));
         mirIfDescr.dwIndex := IfIndex;
         if GetIfEntry(@mirIfDescr) = NO_ERROR then
           Memo1.Lines.Add("AdapterDescription: " + mirIfDescr.bDescr)
         else
           RaiseLastOSError;
       end;
     end
     else
       RaiseLastOSError;
   finally
     FreeMem(lpInfo);
   end;
 end
 //else
   //RaiseLastOSError;
end;


 
bloodman ©   (2006-01-13 17:26) [3]

Огромное Спасибо!!



Страницы: 1 вся ветка

Текущий архив: 2006.04.30;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.028 c
15-1144588919
Бугага
2006-04-09 17:21
2006.04.30
"Дефис" вместо "минуса"


2-1144835417
[0xDEADDEAD]
2006-04-12 13:50
2006.04.30
Помогите с мышкой!!!


3-1141732338
ANB
2006-03-07 14:52
2006.04.30
Выбрать строку с максимальной датой


2-1144825642
Сергей И.
2006-04-12 11:07
2006.04.30
автозагрузка


1-1143001881
Старик
2006-03-22 07:31
2006.04.30
DLL. Ошибка при использовании типа string в ее функциях