Einzelnen Beitrag anzeigen

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