AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Gateway IP über eine API auslesen?

Gateway IP über eine API auslesen?

Ein Thema von Thurgen · begonnen am 11. Sep 2002 · letzter Beitrag vom 16. Jul 2008
Antwort Antwort
Seite 1 von 3  1 23   
Thurgen

Registriert seit: 11. Sep 2002
27 Beiträge
 
#1

Gateway IP über eine API auslesen?

  Alt 11. Sep 2002, 11:23
Hi,

gibt es eine möglichkeit die Gateway IP über eine API Funktion auszulesen oder sowas? Bisher konnte ich die Gateway IP nur aus der Registry entnehmen, wobei das Problem ist das die Information bei jeder Windows Version woanders steht.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#2
  Alt 11. Sep 2002, 11:31
Moin Thurgen,

dazu kannst Du, ab W98/W2K die Api GetAdaptersInfo benutzen.
In den davorliegenden Versionen stehen diese Informationen meines Wissens immer an der gleichen Stelle in der Registry, und können dort direkt ausgelesen werden. (ohne Gewähr, ich kann's gerade nicht nachprüfen)
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Thurgen

Registriert seit: 11. Sep 2002
27 Beiträge
 
#3
  Alt 11. Sep 2002, 11:35
hm komisch ich kann GetAdaptersInfo in meiner SDK hilfe von Delphi 5.0 nicht finden. Gibts dazu irgendwo einen BSP code oder sowas?
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.919 Beiträge
 
Delphi 10.4 Sydney
 
#4
  Alt 11. Sep 2002, 11:42
Hallo,

zwar kein Beispiel-Code aber wenigstens schon mal die Dokumentation: MSDN-Library :: GetAdaptersInfo.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#5
  Alt 11. Sep 2002, 11:47
Moin Thurgen,

die API Hilfe von D5 ist, gelinde gesagt, auch antiquarisch
Für die API empfiehlt es sich immer ein möglichst aktuelles Platform SDK von Microsoft zu benutzen.
Leider habe ich den Link gerade nicht zur Hand, aber wenn Du hier mal nach PSDK suchst, solltest Du ihn finden. Sollte es Deine Internetanbindung nicht ratsam erscheinen lassen das herunterzuladen (ich glaube so ca. 350MB) kannst Du es auch teilweise herunterladen, oder direkt über msdn.microsoft.com nach den aktuellen Informationen suchen.

Funktionen wie GetAdaptersInfo sind auch nicht in Delphi implementiert, so dass man sich diese Funktionen (und dazugehörige Datenstrukturen und Konstanten) selber importieren (deklarieren), bzw. fertige Übersetzungen benutzen muss.

Ich such' derweil nochmal meine Übersetzung raus.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#6
  Alt 11. Sep 2002, 12:27
Moin Thurgen,

hier mal ein wenig Übersetzung:

Code:
const
  MAX_ADAPTER_DESCRIPTION_LENGTH = 128; // arb.
  MAX_ADAPTER_NAME_LENGTH        = 256; // arb.
  MAX_ADAPTER_ADDRESS_LENGTH     = 8;  // arb.
  DEFAULT_MINIMUM_ENTITIES       = 32; // arb.
  MAX_HOSTNAME_LEN               = 128; // arb.
  MAX_DOMAIN_NAME_LEN            = 128; // arb.
  MAX_SCOPE_ID_LEN               = 256; // arb.

  // aus ipifcons
  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
  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;

type
  TcsGetAdaptersInfo  = function(const pAdapterInfo : PIP_ADAPTER_INFO;const pOutBufLen : PULONG) : DWORD; stdcall;

var
  fDLLLoaded       : Boolean = false;
  hDLL             : DWORD  = 0;
  GetAdaptersInfo  : TcsGetAdaptersInfo = nil;
  pAdapterList     : PIP_ADAPTER_INFO = nil;
  dwLen            : DWORD = 0;
  aaiAdapters      : array of PIP_ADAPTER_INFO;
  iAdapterIndex    : integer = 0;
  fFatalError      : Boolean = false;


initialization
begin
  hDLL := GetModuleHandle('IPHLPAPI.DLL');
  if hDLL = 0 then
  begin
    fDLLLoaded := true;
    hDLL      := LoadLibrary('IPHLPAPI.DLL');
    if hDLL <> 0 then
    begin
      @GetAdaptersInfo := GetProcAddress(hDLL,'GetAdaptersInfo');
      if @GetAdaptersInfo = nil then
      begin
        MessageBox(0,'GetAdaptersInfo nicht gefunden','FEHLER',MB_ICONERROR or MB_OK);
        fFatalError := true;
      end;
    end
    else
    begin
      MessageBox(0,PChar('IPHLPAPI.DLL konnte nicht geladen werden.'+#13#10+SysErrorMessage(GetLastError)+#13#10+IntToStr(GetLastError)),'FEHLER',MB_ICONERROR or MB_OK);
        fFatalError := true;
    end;
  end;
  if fFatalError then
  begin
    exit;
  end;
end;

finalization
begin
  if hDLL <> 0 then
  begin
    if fDLLLoaded then
    begin
      FreeLibrary(hDLL);
    end;
  end;
  if Assigned(pAdapterList) then
  begin
    FreeMem(pAdapterList,dwLen);
  end;
end;
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Thurgen

Registriert seit: 11. Sep 2002
27 Beiträge
 
#7
  Alt 11. Sep 2002, 12:36
Uff das sieht ja schon ganz gut aus, nur leider blicke ich da noch nicht so ganz durch da mein letztes Delphi Programm schon ein paar Jahre auf dem Buckel hat.

Wie bekomme ich aus dem Code einen einfach String raus der die Gateway IP enthält? <--N00b
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#8
  Alt 11. Sep 2002, 15:35
Zitat von Christian Seehase:
Leider habe ich den Link gerade nicht zur Hand, ...
Ich aber, steht in meinen Favoriten: http://www.microsoft.com/msdownload/...sdk/sdkupdate/, bzw.
http://www.microsoft.com/msdownload/.../psdk-full.htm

Allerdings muss ich jetzt jemanden anrufen und behaupten, dass er mein bester Kumpel wäre ... er hat nämlich DSL, und ich arbeite noch mit dem PSDK vom Mai.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#9
  Alt 11. Sep 2002, 15:45
Moin Thurgen,

ich hab' mal ein Beispiel zusammengeschraubt.
Wichtig hierbei:
Ich gehe durch sämtliche zurückgegebenen Adapter, und lese dann die Gateways von allen aus, um diese IP dann in die ComboBox zu schreiben, allerdings ohne Zuordnung.

In Abänderung der letzen Info hab' ich die Funktion jetzt statisch importiert. Dass rächt sich z.B. auf einem Rechner, der kein 98/W2K ff hat.

Ich hoffe, Du kommst damit soweit klar, ansonsten wird Dich wohl niemand daran hindern nachzufragen


Code:
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 TfrmMAIN.FormShow(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;
        cobGateway.Clear;
        repeat
          iasWork := pAdapterWork.GatewayList;
          while iasWork.Next <> nil do
          begin
            cobGateway.Items.Add(trim(iasWork.IpAddress.acString));
            iasWork := iasWork.Next^;
          end;
          cobGateway.Items.Add(trim(iasWork.IpAddress.acString));
          pAdapterWork := pAdapterWork.Next;
        until pAdapterWork = nil;
        if cobGateway.Items.Count > 0 then
        begin
          cobGateway.ItemIndex := 0;
        end;
      end;
    finally
      FreeMem(pAdapterList,dwLen);
    end;
  end;
end;
@Mathias:
Prima. Ich hab' vor kurzem erst nachgeschaut, und da war erst Mai drin. Dann kann ich heute Abend ja mal das Update einspielen und den Link auf die Middleware Ergänzungen vergessen. Die sollten da jetzt enthalten sein.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Thurgen

Registriert seit: 11. Sep 2002
27 Beiträge
 
#10
  Alt 11. Sep 2002, 22:06
kannst du das bitte gerade mal als kleines bsp Project erstellen und die Datein im Forum posten? Stehe immer noch etwas auf dem Schlauch, das ist mein erstes Delphi Programm das ich seit 3 Jahren wieder mache
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:36 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