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.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;
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?