![]() |
Fehler beim auslesen GetIFRowData und GetAdaptersInfo
Liste der Anhänge anzeigen (Anzahl: 1)
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:
Im OnChange von der ComboBox dann in etwa so
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;
Delphi-Quellcode:
Jetzt den Source den ich gefunden habe aber eben alle ausliest.
spdevice := ComboBox1.ItemIndex;
GetInfoonAdapter(spdevice);
Delphi-Quellcode:
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?
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.DLL' name '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; |
Re: Fehler beim auslesen GetIFRowData und GetAdaptersInfo
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 ; |
Re: Fehler beim auslesen GetIFRowData und GetAdaptersInfo
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:
Die "Network.pas" zeigt aber nur den zweiten und dritten Adapter an. Andere hingegen eben alle.
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
Delphi-Quellcode:
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 (p^.Index) = index then begin
Delphi-Quellcode:
Hier werden mir ebenfalls vier Adapter ausgegeben.
if index <= IFTableData^.dwNumEntries then begin
Ich würde natürlich sehr gerne weiter bei der Unit bleiben aber ich hab echt keine Ahnung wie ich das anstelle. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:12 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