Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Gateway IP über eine API auslesen? (https://www.delphipraxis.net/818-gateway-ip-ueber-eine-api-auslesen.html)

Tod787 10. Jul 2008 12:57

Re: Gateway IP über eine API auslesen?
 
Also ich würde den Code auch gerne mal ausprobieren nur bekomme ich beim Compilieren die Meldung:

Zitat:

[Pascal Fehler] Unit1.pas(34): E2086 Typ 'PIP_MASK_STRING' ist nicht vollständig definiert
Habe das Formular der Einfachheit TForm1 gnannt und die Combobox auch wieder Combobox1. Aber auch mit den ursprünglichen Bezeichnungen kommt der Fehler. Muss ich evtl noch was einbinden?

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    ComboBox1: TComboBox;
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

  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;

function GetAdaptersInfo(const pAdapterInfo : PIP_ADAPTER_INFO;const pOutBufLen : PULONG) : DWORD; stdcall; external 'IPHLPAPI.DLL' name 'GetAdaptersInfo';
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  dwResult    : DWORD;
  dwLen       : DWORD;
  pAdapterWork : PIP_ADAPTER_INFO;
  pAdapterList : PIP_ADAPTER_INFO;
  iasWork     : IP_ADDR_STRING;

begin
  pAdapterList := nil;
  dwLen       := 0;
  dwResult    := GetAdaptersInfo(pAdapterList,@dwLen);
  if dwResult = ERROR_BUFFER_OVERFLOW then
  begin
    pAdapterList := AllocMem(dwLen);
    try
      dwResult := GetAdaptersInfo(pAdapterList,@dwLen);
      if dwResult = ERROR_SUCCESS then
      begin
        pAdapterWork := pAdapterList;
        ComboBox1.Clear;
        repeat
          iasWork := pAdapterWork.GatewayList;
          while iasWork.Next <> nil do
          begin
            ComboBox1.Items.Add(trim(iasWork.IpAddress.acString));
            iasWork := iasWork.Next^;
          end;
          ComboBox1.Items.Add(trim(iasWork.IpAddress.acString));
          pAdapterWork := pAdapterWork.Next;
        until pAdapterWork = nil;
        if ComboBox1.Items.Count > 0 then
        begin
          ComboBox1.ItemIndex := 0;
        end;
      end;
    finally
      FreeMem(pAdapterList,dwLen);
    end;
  end;
end;

end.

SirThornberry 10. Jul 2008 13:10

Re: Gateway IP über eine API auslesen?
 
schau dir doch mal die Zeile genau an:
Delphi-Quellcode:
PIP_MASK_STRING = ^PIP_MASK_STRING;
wie kann PIP_MASK_STRING gleichzeitig ^PIP_MASK_STRING sein? Hast du dich da vielleicht vertippt? :wink:
das führende P steht übrigens für Pointertyp. Und das was da im Quelltext steht wäre die Erstellung eines Pointertypes auf einen Pointertyp. Einfach die entsprechende Zeile mal ein Weilchen anschauen und dann überlegen was daran wohl falsch ist.

Tod787 10. Jul 2008 13:46

Re: Gateway IP über eine API auslesen?
 
ok mit

Delphi-Quellcode:
  PIP_MASK_STRING = ^PIP_ADDRESS_STRING;
  IP_MASK_STRING = IP_ADDRESS_STRING;
geht es jetzt :)

SirThornberry 11. Jul 2008 15:39

Re: Gateway IP über eine API auslesen?
 
das funktioniert wirklich? richtig ist es meiner Meinung nach so:
Delphi-Quellcode:
PIP_MASK_STRING = ^TIP_MASK_STRING;
Denn das Prinzip der Benennung sieht eigentilch so aus:
Delphi-Quellcode:
PYourType = ^TYourType;
Es wird also vom normalen Typen ein Pointertyp erstellt daher auch das P anstelle des T

Tod787 16. Jul 2008 09:57

Re: Gateway IP über eine API auslesen?
 
Sorry für die Verspätug. Bin umgestiegen auf WMI. Fällt mir deutlich einfacher :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:06 Uhr.
Seite 3 von 3     123   

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