Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi IP Adresse eines Netzwerkadapters (https://www.delphipraxis.net/68946-ip-adresse-eines-netzwerkadapters.html)

Passi077 8. Mai 2006 15:01


IP Adresse eines Netzwerkadapters
 
Hi,

ich will die aktuelle IP Adresse von allen verfügbaren Netzwerkadaptern auslesen. Durch die Forensuche bin ich dann an die Funktion GetPerAdapterInfo gestoßen und habe aich ein paar Code Beispiele gefunden:

Delphi-Quellcode:

const
  MAX_ADAPTER_DESCRIPTION_LENGTH = 128; // arb.
  MAX_ADAPTER_NAME_LENGTH        = 256; // arb.
  MAX_ADAPTER_ADDRESS_LENGTH     = 8;  // arb.

type
  PIP_ADDRESS_STRING = ^IP_ADDRESS_STRING;
  IP_ADDRESS_STRING = packed record
    acString : array [1..16] of Char;
  end;

  PIP_MASK_STRING = ^PIP_MASK_STRING;
  IP_MASK_STRING = IP_ADDRESS_STRING;

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

  time_t = int64;

  PIP_ADAPTER_INFO = ^IP_ADAPTER_INFO;
  IP_ADAPTER_INFO = packed 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;
    dwType             : UINT;
    DhcpEnabled        : UINT;
    CurrentIpAddress   : PIP_ADDR_STRING;
    IpAddressList      : IP_ADDR_STRING;
    GatewayList        : IP_ADDR_STRING;
    DhcpServer         : IP_ADDR_STRING;
    HaveWins           : Boolean;
    PrimaryWinsServer  : IP_ADDR_STRING;
    SecondaryWinsServer : IP_ADDR_STRING;
    LeaseObtained      : time_t;
    LeaseExpires       : time_t;
  end;

  PIP_PER_ADAPTER_INFO = ^IP_PER_ADAPTER_INFO;
  IP_PER_ADAPTER_INFO = packed record
    AutoConfigEnabled : UINT;
    AutoConfigActive : UINT;
    CurrentDnsServer : PIP_ADDR_STRING;
    DnsServerList    : IP_ADDR_STRING;
  end;


function GetAdaptersInfo(const pAdapterInfo : PIP_ADAPTER_INFO;const pOutBufLen : PULONG) : DWORD; stdcall;
function GetPerAdapterInfo(const pIfIndex : ULONG;const pAdapterInfo : PIP_PER_ADAPTER_INFO;const pOutBufLen : PULONG) : DWORD; stdcall;


implementation

function GetAdaptersInfo; external 'iphlpapi.dll';
function GetPerAdapterInfo; external 'iphlpapi.dll';
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  pAdapterList    : PIP_ADAPTER_INFO;
  dwLenAdapter    : DWORD;
  aaiAdapters     : array of PIP_ADAPTER_INFO;
  dwResult        : DWORD;
  iIndexAdapter   : integer;
  iasWork         : IP_ADDR_STRING;
  paiWork         : PIP_PER_ADAPTER_INFO;
  dwLenAdapterInfo : DWORD;


begin
  pAdapterList := nil; // Alles auf 0 ==> Benötigte Buffergrösse ermitteln
  dwLenAdapter := 0;
  if GetAdaptersInfo(pAdapterList,@dwLenAdapter) <> ERROR_BUFFER_OVERFLOW then exit;
  pAdapterList := AllocMem(dwLenAdapter);
  try
    if GetAdaptersInfo(pAdapterList,@dwLenAdapter) <> ERROR_SUCCESS then exit;
    SetLength(aaiAdapters,1);
    aaiAdapters[0] := pAdapterList;
    while aaiAdapters[High(aaiAdapters)].Next <> nil do begin
      SetLength(aaiAdapters,Length(aaiAdapters)+1);
      aaiAdapters[High(aaiAdapters)] := aaiAdapters[High(aaiAdapters)-1].Next;
    end;
    for iIndexAdapter := 0 to high(aaiAdapters) do begin
      ListBox1.Items.Add(trim(aaiAdapters[iIndexAdapter].Description));
      paiWork := nil;
      dwLenAdapterInfo  := 0;
      dwResult := GetPerAdapterInfo(aaiAdapters[iIndexAdapter].Index,paiWork,@dwLenAdapterInfo);
      if dwResult <> ERROR_BUFFER_OVERFLOW then begin
        ListBox1.Items.Add('***** (1) Fehler beim Auslesen der Adapterdaten: '+IntToStr(dwResult));
      end else begin
        paiWork := AllocMem(dwLenAdapterInfo);
        try
          dwResult := GetPerAdapterInfo(aaiAdapters[iIndexAdapter].Index,paiWork,@dwLenAdapterInfo);
          if dwResult <> ERROR_SUCCESS then begin
            ListBox1.Items.Add('***** (2) Fehler beim Auslesen der Adapterdaten: '+IntToStr(dwResult));
          end else begin
            iasWork := paiWork.DnsServerList;
            while iasWork.Next <> nil do begin
              ListBox1.Items.Add('DNS: '+ trim(iasWork.IpAddress.acString));

              iasWork := iasWork.Next^;
            end;
              ListBox1.Items.Add('DNS: '+ trim(iasWork.IpAddress.acString));
          end;
        finally
          FreeMem(paiWork,dwLenAdapterInfo);
        end;
      end;
    end;
  finally
    FreeMem(pAdapterList,dwLenAdapter);
  end;
end;

Dieser Code gibt alle Adapter inkl. DNS aus. Nun brauche ich aber noch die aktuelle IP. Da CurrentIpAddress aber vom Typ PIP_ADDR_STRING ist, weiß ich nicht wie ich diesen Wert ausgebe (was bedeutet das Dach..?).. trim funktioniert hier nicht..

Kann mir jemand helfen?

Vielen Dank + Grüße
Passi

pacman1986 8. Mai 2006 15:23

Re: IP Adresse eines Netzwerkadapters
 
es handelt sich dabei um einen pointer bzw. einen zeiger

dsdt.info


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:31 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz