AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Netzwerkadapter verbunden?
Thema durchsuchen
Ansicht
Themen-Optionen

Netzwerkadapter verbunden?

Offene Frage von "CodeX"
Ein Thema von CodeX · begonnen am 8. Feb 2008 · letzter Beitrag vom 17. Feb 2008
Antwort Antwort
CodeX

Registriert seit: 30. Okt 2004
475 Beiträge
 
Delphi 12 Athens
 
#1

Netzwerkadapter verbunden?

  Alt 8. Feb 2008, 17:21
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.

http://www.microsoft.com/library/med...ctions-new.GIF

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?
  Mit Zitat antworten Zitat
Benutzerbild von x000x
x000x

Registriert seit: 21. Jan 2004
Ort: Bei Hamburg
308 Beiträge
 
Delphi XE2 Professional
 
#2

Re: Netzwerkadapter verbunden?

  Alt 8. Feb 2008, 18:06
Moin moin,
bin mir nicht 100%ig sicher, glaube aber mit WMI funktioniert des...
Suche mal nach NetConnectionStatus
Peter
-= Gruss Peter =-
-= alias x000x =-
  Mit Zitat antworten Zitat
CodeX

Registriert seit: 30. Okt 2004
475 Beiträge
 
Delphi 12 Athens
 
#3

Re: Netzwerkadapter verbunden?

  Alt 8. Feb 2008, 18:37
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"?
  Mit Zitat antworten Zitat
CodeX

Registriert seit: 30. Okt 2004
475 Beiträge
 
Delphi 12 Athens
 
#4

Re: Netzwerkadapter verbunden?

  Alt 12. Feb 2008, 00:36
Keine weiteren Ideen?
  Mit Zitat antworten Zitat
Basilikum

Registriert seit: 9. Aug 2003
389 Beiträge
 
Delphi 7 Professional
 
#5

Re: Netzwerkadapter verbunden?

  Alt 12. Feb 2008, 07:30
MSDN-Library durchsuchenGetIfTable und MSDN-Library durchsuchenGetIfEntry liefert dir die gewünschte Info (dwOperStatus)...
  Mit Zitat antworten Zitat
CodeX

Registriert seit: 30. Okt 2004
475 Beiträge
 
Delphi 12 Athens
 
#6

Re: Netzwerkadapter verbunden?

  Alt 12. Feb 2008, 17:11
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:
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 'iphlpapiname '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.
Nun meine Probleme damit:

1. Bei if (L.cbRequired <=0) { or (L.cbRequired>sizeof(TifTable)) } then exit; 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.

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...
  Mit Zitat antworten Zitat
CodeX

Registriert seit: 30. Okt 2004
475 Beiträge
 
Delphi 12 Athens
 
#7

Re: Netzwerkadapter verbunden?

  Alt 17. Feb 2008, 15:30
Ich bin hier leider noch nicht weiter.

Besonders wichtig wäre für mich die zweite Frage. Hier nochmal:

Zitat:
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.
Genau das war ja die ursprüngliche Frage, wie ich an den verbunden/getrennt Status komme. Die Anfrage dazu funktioniert über dwOperStatus scheinbar leider nicht.

Ist am Code was falsch? Oder gibt es noch eine andere Möglichkeit?
  Mit Zitat antworten Zitat
Antwort Antwort


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 04:27 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