Einzelnen Beitrag anzeigen

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