![]() |
Netzwerkadapter verbunden?
Ich würde gerne gezielt überprüfen, ob ein bestimmter Netzwerkadapter verbunden ist oder nicht. Es geht dabei nicht darum, ob er aktiviert ist oder eine IP hat, sondern wirklich nur, ob ein Kabel dranhängt bzw Verbindung zu einem HotSpot aufgenommen wurde.
In Windows wird das in den Netzwerkeinstellungen mit einem roten X angezeigt. Im prinzip benötige ich genau die Funktion, die auch da zum Einsatz kommt. ![]() Mit GetAdaptersInfo komme ich leider nicht ran. Am liebsten würde ich den Adapter dabei mit seiner ID abfragen ({D2FBA7F-...). Was ist hier die beste Lösung? |
Re: Netzwerkadapter verbunden?
Moin moin,
bin mir nicht 100%ig sicher, glaube aber mit WMI funktioniert des... Suche mal nach NetConnectionStatus |
Re: Netzwerkadapter verbunden?
Ich habe die Erfahrung gemacht, dass WMI nicht auf allen Systemen problemlos funktioniert und manchmal zu langsam initialisiert wird (besonders beim ersten Aufruf, danach landet das wohl in einer Art Cache).
Gibts noch eine andere Möglichkeit als WMI? Etwas "schlankes"? |
Re: Netzwerkadapter verbunden?
Keine weiteren Ideen?
|
Re: Netzwerkadapter verbunden?
|
Re: Netzwerkadapter verbunden?
Ok, das ist doch mal ein guter neuer Ansatz. Ich habe mal ein bisschen gesucht, gebastelt und getestet. Momentan habe ich das hier:
Delphi-Quellcode:
Nun meine Probleme damit:
unit GetIf;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; const MAX_INTERFACE_NAME_LEN = $100; // maximale Länge Name des Interfaces MAXLEN_PHYSADDR = 8; // maximale Länge der physischen Adresse MAXLEN_IFDESCR = $100; // maximale Länge Beschreibung des Int. type TMIB_IFROW = record wszName : array [0 .. (MAX_INTERFACE_NAME_LEN*2-1)] of char; dwIndex : cardinal; // index of the interface dwType : Longint ;// type of interface dwMtu : Longint ;// max transmission unit dwSpeed : Longint ;// speed of the interface dwPhysAddrLen : Longint ;// length of physical address bPhysAddr : array [0 .. (MAXLEN_PHYSADDR-1)] of byte ;// physical address of adapter dwAdminStatus : Longint ;// administrative status dwOperStatus : Longint ;// operational status dwLastChange : Longint ;// last time operational status changed dwInOctets : Longint ;// octets received dwInUcastPkts : Longint ;// unicast packets received dwInNUcastPkts : Longint ;// non-unicast packets received dwInDiscards : Longint ;// received packets discarded dwInErrors : Longint ;// erroneous packets received dwInUnknownProtos : Longint ;// unknown protocol packets received dwOutOctets : Longint ;// octets sent dwOutUcastPkts : Longint ;// unicast packets sent dwOutNUcastPkts : Longint ;// non-unicast packets sent dwOutDiscards : Longint ;// outgoing packets discarded dwOutErrors : Longint ;// erroneous packets sent dwOutQLen : Longint ;// output queue length dwDescrLen : Longint ;// length of bDescr member bDescr :array[0 .. (MAXLEN_IFDESCR-1)] of char ;// interface description End; TifTable = record nRows : LongInt; // Anzahl Interfaces ifRow : array[1..20]of TMIB_IFROW; // mehr als 20 sollten es aber nicht sein! end; var pIfTable : ^TifTable; // ein Pointer auf eine Interfacetabelle L : record // L ist ein Record für das Auslesen der Werte cbRequired : Longint; // wird gebraucht, um die benötigte Buffer-Größe zu ermitteln nStructSize : LongInt; tmp : String; end; cCode : Word; // Einbinden der Funktion aus iphlpapi, um empfangene und gesendete Bytes und die Interfaces-Stats zu holen function GetIfTable(pIfRowTable: Pointer ; var pdwSize : Longint; bOrder : LongInt): Longint;stdcall; function GetIfTable; external 'iphlpapi' name 'GetIfTable'; procedure testLauf; implementation procedure testLauf; var i: integer; begin pIfTable := nil; // Zeiger auf eine Struktur des Types TIFTable ZeroMemory(@L, sizeof(L)); // schauen, wie gross die Tabelle ist.. cCode := GetIfTable(pIfTable, L.cbRequired,1); if (L.cbRequired <=0) { or (L.cbRequired>sizeof(TifTable)) } then exit; // Mem allokieren und IP-Table empfangen... GetMem(pIfTable, L.cbRequired); ZeroMemory(pIfTable, L.cbrequired); cCode := GetIfTable(pIfTable, L.cbRequired, 1); if cCode <> ERROR_SUCCESS then begin showmessage ('Fehler beim Funktionsaufruf') ; exit; end; for i:= 1 to pIfTable^.nRows do begin // nRows ist die Anzahl der Interfaces Form3.Memo1.Lines.Add(pIfTable^.ifRow[i].bDescr); Form3.Memo1.Lines.Add(pIfTable^.ifRow[i].wszName); Form3.Memo1.Lines.Add('dwOperStatus: '+IntToStr(pIfTable^.ifRow[i].dwOperStatus)); Form3.Memo1.Lines.Add(''); end; freemem(piftable,sizeof(piftable)); end; end. 1. Bei
Delphi-Quellcode:
habe ich die zweite Bedingung auskommentiert, weil diese immer wahr war und nichts ausgegeben wurde. Wo liegt der Fehler? Diese Abfrage habe ich in der Form in mehreren Beispielen gefunden.
if (L.cbRequired <=0) { or (L.cbRequired>sizeof(TifTable)) } then exit;
2. pIfTable^.ifRow[i].dwOperStatus ist immer nur 0 oder 5 und das bei ~30 ausgegebenen Werten. Diese bedeuten aber nur NON_OPERATIONAL oder OPERATIONAL. DISCONNECTED oder CONNECTED habe ich leider nirgends. 3. pIfTable^.ifRow[i].wszName wird immer nur als '\' ausgegeben. Ich nehme an, hier käme ich an meine gewünschte ID ({D2FBA7F-...), aber das tuts momentan ja noch nicht. Ich muss die erwähnten ~30 Ausgaben aber irgendwie Filtern können. Nur anhand der Beschreibung komme ich nicht zum Ziel, sonst sehe ich aber keine anderen IDs o.Ä. edit: OK, ich käme über dwIndex schon an einen speziellen Adapter, aber mir wärde dennoch die Abfrage nach der ID lieber, falls das möglich ist. Hoffe, meinen Fragen kann geholfen werden... |
Re: Netzwerkadapter verbunden?
Ich bin hier leider noch nicht weiter.
Besonders wichtig wäre für mich die zweite Frage. Hier nochmal: Zitat:
Ist am Code was falsch? Oder gibt es noch eine andere Möglichkeit? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:43 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz