AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Fehler beim auslesen GetIFRowData und GetAdaptersInfo
Thema durchsuchen
Ansicht
Themen-Optionen

Fehler beim auslesen GetIFRowData und GetAdaptersInfo

Ein Thema von Cyberaxx · begonnen am 13. Aug 2006 · letzter Beitrag vom 14. Aug 2006
Antwort Antwort
Benutzerbild von Cyberaxx
Cyberaxx

Registriert seit: 15. Jul 2005
311 Beiträge
 
Delphi XE5 Professional
 
#1

Fehler beim auslesen GetIFRowData und GetAdaptersInfo

  Alt 13. Aug 2006, 15:34
Habe ein kleines Problem beim Auslesen der Informationen von GetIFRowData und GetAdaptersInfo.

Von ViRuSTriNiTy wurde mir eine Unit zur verfügung gestellt um die Informationen auszulesen,
doch ist da ein kleines Problem denn es werden komischerweise nicht alle Adapter gefunden.
Dies ist mir nicht aufgefallen aber als ein Freund mein kleines Programm zum testen bekam,
tauchte sein USB-W-LAN Stick nicht auf.
In meinem Programm ist sie leider schon recht gut eingebunden als das ich sie mal eben so entfernen
kann, leider.
Vielleicht könnte sie sich mal jemand ansehen und evtl. nen Tip hat wo man was ändern muss.
Ich selber habe von der API Programmierung leider noch nicht viel Ahnung und fast jede Änderung die
ich vorgenommen habe gibt weitere Fehler aus.
Habe mich dann in Foren umgesehen und auch einiges gefunden. Das problem ist nun das so gut wie alle
gleich alle Adapter auslesen, ich hätte jedoch gerne, das ich einfach nur einen auslesen würde aber
nicht weiss wo ich meinen "Index" hinschreiben/übergeben muss.
Bin auch mittlerweile auf eine andere Unit umgestiegen zum testen, da hole ich mir einen Adapter
aus der Liste und überwache ihn anhand der "ID". Jetzt möchte ich halt auch gerne weitere
Informationen zum betreffenden Adapter, ohne das ich die anderen gleich mit auslese.

Ich verwende dort nun die Unit "IpHlpApi.pas"

Delphi-Quellcode:
procedure TForm1.GetAdapters(ComboBox: TComboBox);
var
MibRow: TMibIfRow;
IntfTable: PMibIfTable;
Size: DWORD;
I: Integer;
begin
size := 0;
  if GetIfTable(nil, Size, True) <> ERROR_INSUFFICIENT_BUFFER then Exit;
  IntfTable := AllocMem(Size);
  try
    if GetIfTable(IntfTable, Size, True) = NO_ERROR then
    begin
    for I := 0 to IntfTable^.dwNumEntries - 1 do
      begin
      {$R-}MibRow := IntfTable.Table[I];{$R+}

      ComboBox.Items.Add(PChar(@MibRow.bDescr[0]) + '@' + InttoStr(MibRow.dwSpeed div 1000000)
        + 'MBit/s');

      end;
    end;
  Old := MibRow.dwInOctets;
  Old2 := MibRow.dwOutOctets;
  finally
  FreeMem(IntfTable);
end;
end;
Im OnChange von der ComboBox dann in etwa so

Delphi-Quellcode:
spdevice := ComboBox1.ItemIndex;
GetInfoonAdapter(spdevice);
Jetzt den Source den ich gefunden habe aber eben alle ausliest.

Delphi-Quellcode:
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.DLLname 'GetAdaptersInfo';

procedure TMain.FormCreate(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
        Memo1.Lines.Add(pAdapterWork.Description);
        Memo1.Lines.Add(pAdapterWork.AdapterName);
        Memo1.Lines.Add('-----');
          iasWork := pAdapterWork.IpAddressList;
          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;
Wie stelle ich das an das ich nur von einem Apdapter die Infos auslese, geht das ohne grossartig den Code zu verändern, auch wenn er hier aus dem Forum ist?
Angehängte Dateien
Dateityp: pas kopie_von_network_340.pas (11,9 KB, 13x aufgerufen)
Daniel
  Mit Zitat antworten Zitat
Benutzerbild von Cyberaxx
Cyberaxx

Registriert seit: 15. Jul 2005
311 Beiträge
 
Delphi XE5 Professional
 
#2

Re: Fehler beim auslesen GetIFRowData und GetAdaptersInfo

  Alt 13. Aug 2006, 18:57
Ich sehe grad in einer anderen Unit, das man die Informationen etwas anders auslesen kann.

Habe das hier gefunden, ist ja auch ein Record also könnte man ihn ähnlich verwenden?
Ich würde gerne so viele Informationen bekommen wie es geht auch z.b. das hier die Mac-Adresse direkt als String ausgegeben wird.

Delphi-Quellcode:
// for IpHlpAdaptersInfo
  TAdaptorInfo = record
    AdapterName: string ;
    Description: string ;
    MacAddress: string ;
    Index: DWORD;
    aType: UINT;
    DHCPEnabled: UINT;
    CurrIPAddress: string ;
    CurrIPMask: string ;
    IPAddressTot: integer ;
    IPAddressList: array of string ;
    IPMaskList: array of string ;
    GatewayTot: integer ;
    GatewayList: array of string ;
    DHCPTot: integer ;
    DHCPServer: array of string ;
    HaveWINS: BOOL;
    PrimWINSTot: integer ;
    PrimWINSServer: array of string ;
    SecWINSTot: integer ;
    SecWINSServer: array of string ;
    LeaseObtained: LongInt ; // UNIX time, seconds since 1970
    LeaseExpires: LongInt; // UNIX time, seconds since 1970
    AutoConfigEnabled: UINT ; // next 4 from IP_Per_Adaptor_Info, W2K and later
    AutoConfigActive: UINT ;
    CurrentDNSServer: string ;
    DNSServerTot: integer ;
    DNSServerList: array of string ;
  end ;

  TAdaptorRows = array of TAdaptorInfo ;
Daniel
  Mit Zitat antworten Zitat
Benutzerbild von Cyberaxx
Cyberaxx

Registriert seit: 15. Jul 2005
311 Beiträge
 
Delphi XE5 Professional
 
#3

Re: Fehler beim auslesen GetIFRowData und GetAdaptersInfo

  Alt 14. Aug 2006, 22:48
Ich weiss nicht ob man das nun pushen nennt aber ich hab ein wenig an dem Original rumprobiert, da mein Programm ja auf der Unit aufbaut.

Mit ist aufgefallen das bei mir eigentlich vier "Adapter" sind.

Code:
1. MS TCP Loopback interface@10MBit/s
2. VIA-kompatibler Fast Ethernet-Adapter - Paketplaner-Miniport@10MBit/s
3. acer IPN2220 Wireless LAN Card - Paketplaner-Miniport@54MBit/s
4. WAN (PPP/SLIP) Interface@10MBit/s
Die "Network.pas" zeigt aber nur den zweiten und dritten Adapter an. Andere hingegen eben alle.

if (p^.Index) = index then begin Wenn ich mir nun hier nen Break hinsetze und den Cursor beobachte sehe ich das auch mein WAN also Nummer vier auftaucht aber dennoch in der ComboBox nicht angezeigt wird.

if index <= IFTableData^.dwNumEntries then begin Hier werden mir ebenfalls vier Adapter ausgegeben.

Ich würde natürlich sehr gerne weiter bei der Unit bleiben aber ich hab echt keine Ahnung wie ich das anstelle.
Daniel
  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 06:44 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