Gateway IP über eine API auslesen?
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. |
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) |
hm komisch ich kann GetAdaptersInfo in meiner SDK hilfe von Delphi 5.0 nicht finden. Gibts dazu irgendwo einen BSP code oder sowas?
|
Hallo,
zwar kein Beispiel-Code aber wenigstens schon mal die Dokumentation: MSDN-Library :: GetAdaptersInfo. |
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. |
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; |
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 :) |
Zitat:
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. :wink: |
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:
@Mathias:
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; 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. |
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 :)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:19 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