2009-02-23 4 views

ответ

16

Получить JEDI-преобразование библиотеки помощника Microsoft IP от Project JEDI API Header Library - файл IPHlpAPI.zip. Распакуйте файлы, вам нужны IpTypes.pas и IpHlpApi.pas. Затем вы можете использовать что-то вроде этого:

procedure TForm1.Button1Click(Sender: TObject); 
var 
    NumInterfaces: Cardinal; 
    AdapterInfo: array of TIpAdapterInfo; 
    OutBufLen: ULONG; 
    i: integer; 
begin 
    GetNumberOfInterfaces(NumInterfaces); 
    SetLength(AdapterInfo, NumInterfaces); 
    OutBufLen := NumInterfaces * SizeOf(TIpAdapterInfo); 
    GetAdaptersInfo(@AdapterInfo[0], OutBufLen); 

    Memo1.Lines.Clear; 
    for i := 0 to NumInterfaces - 1 do begin 
    Memo1.Lines.Add(Format('%.2x:%.2x:%.2x:%.2x:%.2x:%.2x', 
     [AdapterInfo[i].Address[0], AdapterInfo[i].Address[1], 
     AdapterInfo[i].Address[2], AdapterInfo[i].Address[3], 
     AdapterInfo[i].Address[4], AdapterInfo[i].Address[5]])); 
    end; 
end; 

(Все обработки ошибок опущена, вы должны добавить его, конечно.)

+0

я использовал его, и для меня это дает все MAC-адрес, 00:00:00 : 00: 00: 00. Что я могу сделать в этом неправильно? Я использовал OutBufLen как кардинал вместо ULONG, как упоминалось здесь. – skjoshi

+0

@ Sanju: Проверка ошибок не производится, поэтому после неудачного вызова API это может быть только заполненная нулями (неинициализированная) память. Попробуйте добавить проверку на результат 'GetAdaptersInfo()'. Также попробуйте запустить это как администратор. – mghie

+1

IPHlpAPI.zip больше не доступен. Где я могу его найти? – Hwau

0

, не зная почти ничего о delphi, как о запуске% system32% \ ipconfig.exe/all и анализе вывода?

+0

Вывод может быть локализована так разборе потребует тестирования на для различных версий Windows - от Афганистана до Зимбабве – mjn

1

GetAdaptersAddresses function является предпочтительным способом для получения адаптеров информации с 2001 года Windows XP.

Информация об адаптере возвращается в IP_ADAPTER_ADDRESSES structure по параметру AdapterAddresses.

GetAdaptersAddresses функция может получить информацию для IPv4 и IPv6 адреса.

Рекомендованный метод вызова функции GetAdaptersAddresses состоит в том, чтобы предварительно назначить рабочий буфер 15 КБ, на который указывает параметр AdapterAddresses. На типичных компьютерах это значительно снижает вероятность того, что функция GetAdaptersAddresses вернет ERROR_BUFFER_OVERFLOW, что потребует многократного вызова функции GetAdaptersAddresses.


procedure TForm1.Button1Click(Sender: TObject); 
const 
    AF_UNSPEC = 0; 
    GAA_FLAG_INCLUDE_ALL_INTERFACES = $100; 
    WORKING_BUFFER_SIZE = 15000; 
    MAX_TRIES = 3; 
var 
    pAddresses, 
    pCurrAddresses: PIpAdapterAddresses; 
    dwRetVal, 
    outBufLen: Cardinal; 
    i: Integer; 
    macAddress: string; 
begin 
    Memo1.Lines.Clear; 

    outBufLen := WORKING_BUFFER_SIZE; 
    pAddresses := nil; 
    i := 0; 
    repeat 
    if Assigned(pAddresses) then 
     FreeMem(pAddresses); 

    GetMem(pAddresses, outBufLen); 
    if not Assigned(pAddresses) then 
     raise Exception.Create('Memory allocation failed for IP_ADAPTER_ADDRESSES struct'); 

    dwRetVal := GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_INCLUDE_ALL_INTERFACES, nil, pAddresses, @outBufLen); 
    Inc(i); 
    until (dwRetVal <> ERROR_BUFFER_OVERFLOW) or (i = MAX_TRIES); 

    try 
    if NO_ERROR <> dwRetVal then begin 
     if ERROR_NO_DATA = dwRetVal then begin 
     MessageDlg('No addresses were found for the requested parameters', mtInformation, [mbOK], 0); 
     Exit; 
     end 
     else 
     raise Exception.Create(SysErrorMessage(dwRetVal)); 
    end; 

    pCurrAddresses := pAddresses; 
    while Assigned(pCurrAddresses) do begin 
     if pCurrAddresses^.PhysicalAddressLength > 0 then begin 
     Memo1.Lines.Add(pCurrAddresses^.FriendlyName); 
     macAddress := ''; 
     for i := 0 to pCurrAddresses^.PhysicalAddressLength - 1 do begin 
      if i > 0 then 
      macAddress := macAddress + ':'; 
      macAddress := macAddress + Format('%.2X', [pCurrAddresses^.PhysicalAddress[i]]); 
     end; 
     Memo1.Lines.Add(macAddress); 
     Memo1.Lines.Add(''); 
     end; 
     pCurrAddresses := pCurrAddresses^.Next; 
    end; 

    finally 
    if Assigned(pAddresses) then 
     FreeMem(pAddresses); 
    end; 
end; 
Смежные вопросы