Registriert seit: 27. Nov 2017
2.490 Beiträge
Delphi 7 Professional
|
AW: Netzwerkstatus abfragen
19. Feb 2024, 12:46
Habe spasseshalber mal den Chatbot meiner Wahl interviewt, dabei ist dashier herausgekommen:
Zitat von Frage:
Ich möchte in Delphi ein Programm schreiben, welches den Status eines (im Hintergrund laufenden) Netzwerkadapters/-gerätes periodisch abfragt.
Bsp.: Ich habe ein Netzwerkgerät "Ethernet 3 - Internet", von dem ich periodisch wissen möchte, ob es aktiv ist oder nicht.
In den Statuseigenschaften dieses Adapters sehe ich unter "Medienstatus" bspw."aktiviert".
Vermutlich würde es reichen, diesen Medienstatus abzufragen. Weiß evtl. jemand, ob bzw. wie das programmatisch umsetzbar wäre?
Zitat von Antwort:
Ja, es ist möglich, den Status eines Netzwerkadapters in Delphi programmatisch abzufragen. Eine Möglichkeit besteht darin, die Windows Management Instrumentation ( WMI) zu verwenden. Allerdings kann WMI auf einigen Systemen Probleme verursachen oder zu langsam initialisieren².
Eine andere Möglichkeit besteht darin, die Funktionen 'GetIfTable' und 'GetIfEntry' zu verwenden, die Ihnen den gewünschten Status ('dwOperStatus') liefern können². Hier ist ein einfacher Codeausschnitt, der zeigt, wie man diese Funktionen verwenden könnte:
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
// ...
// Weitere Felder können hinzugefügt werden, um zusätzliche Informationen zu erhalten
end;
implementation
// Hier können Sie die Funktionen GetIfTable und GetIfEntry aufrufen, um den Status des Netzwerkadapters abzurufen
end.
Zitat von Fortsetzung der Antwort:
Zitat von Frage:
Wie könnte ein konkreter Aufruf von GetIfTable und GetIfEntry in Delphi aussehen?
Zitat von Antwort:
Hier ist ein einfacher Codeausschnitt, der zeigt, wie man die Funktionen 'GetIfTable' und 'GetIfEntry' in Delphi verwenden könnte:
Delphi-Quellcode:
unit GetIf;
interface
uses
Windows, SysUtils;
type
PMIB_IFROW = ^MIB_IFROW;
MIB_IFROW = packed record
wszName: array[0..MAX_INTERFACE_NAME_LEN * 2 - 1] of WideChar;
dwIndex: DWORD;
dwType: DWORD;
dwMtu: DWORD;
dwSpeed: DWORD;
dwPhysAddrLen: DWORD;
bPhysAddr: array[0..MAXLEN_PHYSADDR - 1] of BYTE;
dwAdminStatus: DWORD;
dwOperStatus: DWORD;
dwLastChange: DWORD;
dwInOctets: DWORD;
dwInUcastPkts: DWORD;
dwInNUcastPkts: DWORD;
dwInDiscards: DWORD;
dwInErrors: DWORD;
dwInUnknownProtos: DWORD;
dwOutOctets: DWORD;
dwOutUcastPkts: DWORD;
dwOutNUcastPkts: DWORD;
dwOutDiscards: DWORD;
dwOutErrors: DWORD;
dwOutQLen: DWORD;
dwDescrLen: DWORD;
bDescr: array[0..MAXLEN_IFDESCR - 1] of AnsiChar;
end;
function GetIfEntry(pIfRow: PMIB_IFROW): DWORD; stdcall; external ' IPHLPAPI.DLL';
function GetIfTable(pIfTable: Pointer; var pdwSize: ULONG; bOrder: BOOL): ULONG; stdcall; external ' IPHLPAPI.DLL';
implementation
end.
Zitat von Fortsetzung der Antwort:
In diesem Codeausschnitt wird die 'GetIfEntry' Funktion importiert, die einen Zeiger auf eine 'MIB_IFROW' Struktur erwartet. Diese Struktur enthält Informationen über das Netzwerkinterface, einschließlich des Betriebsstatus ('dwOperStatus'). Sie können eine Instanz dieser Struktur erstellen, den 'dwIndex' auf den Index des gewünschten Netzwerkadapters setzen und dann die 'GetIfEntry' Funktion aufrufen, um die Struktur mit Informationen zu füllen¹.
Bitte beachten Sie, dass dieser Codeausschnitt nur ein Anfangspunkt ist und entsprechend Ihren Anforderungen erweitert werden muss¹. Es ist auch wichtig zu beachten, dass Sie Administratorrechte benötigen könnten, um auf bestimmte Netzwerkinformationen zuzugreifen¹.
Quelle: Unterhaltung mit Bing, 19.2.2024
(1) delphi - GetIfTable results change after Windows updates on certain .... https://stackoverflow.com/questions/...tain-computers.
(2) GetIfTable2 - MIB_IF_ROW2 - Delphi-PRAXiS. https://www.delphipraxis.net/165808-...b_if_row2.html.
(3) 50 plattformübergreifende Beispiele für Delphi 10.3 Rio FireMonkey. https://learndelphi.org/de/50-cross-...io-firemonkey/.
Zitat von Frage:
Könnte ich diese Funktionen z. B. per TTimer in einem Zeitintervall von 10 Sekunden aufrufen und das Ergebnis in einem TMemo oder einem TStringGrid ausgeben?
Zitat von Antwort:
Ja, Sie können einen 'TTimer' verwenden, um die Netzwerkstatusabfrage periodisch durchzuführen und das Ergebnis in einem 'TMemo' oder 'TStringGrid' auszugeben. Hier ist ein einfacher Codeausschnitt, der zeigt, wie man das machen könnte:
Delphi-Quellcode:
unit MainForm;
interface
uses
Windows, SysUtils, Classes, Controls, Forms, StdCtrls, ExtCtrls, GetIf;
type
TForm1 = class(TForm)
Memo1: TMemo;
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Timer1Timer(Sender: TObject);
var
IfRow: MIB_IFROW;
begin
ZeroMemory(@IfRow, SizeOf(IfRow));
IfRow.dwIndex := 1; // Setzen Sie hier den Index Ihres Netzwerkadapters ein
if GetIfEntry(@IfRow) = NO_ERROR then
begin
Memo1.Lines.Add(' Status: ' + IntToStr(IfRow.dwOperStatus));
end
else
begin
Memo1.Lines.Add(' Fehler beim Abrufen des Netzwerkstatus');
end;
end;
end.
Zitat von Fortsetzung der Antwort:
In diesem Codeausschnitt wird ein 'TTimer' verwendet, um alle 10 Sekunden (Sie können das Intervall auf 10000 Millisekunden setzen) den Status des Netzwerkadapters abzufragen und das Ergebnis in einem 'TMemo' auszugeben.
Bitte beachten Sie, dass dieser Codeausschnitt nur ein Anfangspunkt ist und entsprechend Ihren Anforderungen erweitert werden muss. Es ist auch wichtig zu beachten, dass Sie Administratorrechte benötigen könnten, um auf bestimmte Netzwerkinformationen zuzugreifen.
Zitat von Frage:
Wie kann ich den Status mehrerer Netzwerkadapter abfragen?
Zitat von Antwort:
Um den Status mehrerer Netzwerkadapter abzufragen, können Sie die Funktion 'GetIfTable' verwenden. Diese Funktion gibt eine Tabelle aller Netzwerkadapter auf dem System zurück. Sie können dann durch diese Tabelle iterieren und für jeden Eintrag die Funktion 'GetIfEntry' aufrufen, um den Status des jeweiligen Adapters zu erhalten.
Hier ist ein einfacher Codeausschnitt, der zeigt, wie man das machen könnte:
Delphi-Quellcode:
unit MainForm;
interface
uses
Windows, SysUtils, Classes, Controls, Forms, StdCtrls, ExtCtrls, GetIf;
type
TForm1 = class(TForm)
Memo1: TMemo;
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Timer1Timer(Sender: TObject);
var
pIfTable: PMIB_IFTABLE;
dwSize: ULONG;
i: Integer;
IfRow: MIB_IFROW;
begin
dwSize := 0;
GetIfTable( nil, dwSize, False); // Erster Aufruf, um die benötigte Größe zu ermitteln
GetMem(pIfTable, dwSize);
try
if GetIfTable(pIfTable, dwSize, True) = NO_ERROR then // Zweiter Aufruf, um die Daten zu erhalten
begin
for i := 0 to pIfTable^.dwNumEntries - 1 do
begin
ZeroMemory(@IfRow, SizeOf(IfRow));
IfRow.dwIndex := pIfTable^.table[i].dwIndex;
if GetIfEntry(@IfRow) = NO_ERROR then
begin
Memo1.Lines.Add(' Adapter ' + IntToStr(i) + ' : ' + ' Status: ' + IntToStr(IfRow.dwOperStatus));
end
else
begin
Memo1.Lines.Add(' Fehler beim Abrufen des Netzwerkstatus');
end;
end;
end;
finally
FreeMem(pIfTable);
end;
end;
end.
Zitat von Fortsetzung der Antwort:
In diesem Codeausschnitt wird ein 'TTimer' verwendet, um alle 10 Sekunden (Sie können das Intervall auf 10000 Millisekunden setzen) den Status aller Netzwerkadapter abzufragen und das Ergebnis in einem 'TMemo' auszugeben¹.
Bitte beachten Sie, dass dieser Codeausschnitt nur ein Anfangspunkt ist und entsprechend Ihren Anforderungen erweitert werden muss¹. Es ist auch wichtig zu beachten, dass Sie Administratorrechte benötigen könnten, um auf bestimmte Netzwerkinformationen zuzugreifen¹.
Quelle: Unterhaltung mit Bing, 19.2.2024
(1) Delphi Aktiven Netzwerkadapter bestimmen - Delphi-PRAXiS. https://www.delphipraxis.net/67160-a...bestimmen.html.
(2) Delphi Netzwerkstatus abfragen - Delphi-PRAXiS. https://www.delphipraxis.net/214669-...-abfragen.html.
(3) Delphi Netzwerkadapter verbunden? - Delphi-PRAXiS. https://www.delphipraxis.net/108194-...verbunden.html.
Zitat von Frage:
Wie kann ich die Informationen in einem TStringGrid ausgeben?
Zitat von Antwort:
Um die Informationen in einem 'TStringGrid' auszugeben, können Sie die 'Cells'-Eigenschaft des 'TStringGrid' verwenden. Hier ist ein einfacher Codeausschnitt, der zeigt, wie man das machen könnte:
Delphi-Quellcode:
unit MainForm;
interface
uses
Windows, SysUtils, Classes, Controls, Forms, StdCtrls, ExtCtrls, Grids, GetIf;
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Timer1Timer(Sender: TObject);
var
pIfTable: PMIB_IFTABLE;
dwSize: ULONG;
i: Integer;
IfRow: MIB_IFROW;
begin
dwSize := 0;
GetIfTable( nil, dwSize, False); // Erster Aufruf, um die benötigte Größe zu ermitteln
GetMem(pIfTable, dwSize);
try
if GetIfTable(pIfTable, dwSize, True) = NO_ERROR then // Zweiter Aufruf, um die Daten zu erhalten
begin
StringGrid1.RowCount := pIfTable^.dwNumEntries + 1; // +1 für die Überschrift
StringGrid1.Cells[0, 0] := ' Adapter';
StringGrid1.Cells[1, 0] := ' Status';
for i := 0 to pIfTable^.dwNumEntries - 1 do
begin
ZeroMemory(@IfRow, SizeOf(IfRow));
IfRow.dwIndex := pIfTable^.table[i].dwIndex;
if GetIfEntry(@IfRow) = NO_ERROR then
begin
StringGrid1.Cells[0, i + 1] := ' Adapter ' + IntToStr(i);
StringGrid1.Cells[1, i + 1] := ' Status: ' + IntToStr(IfRow.dwOperStatus);
end
else
begin
StringGrid1.Cells[0, i + 1] := ' Adapter ' + IntToStr(i);
StringGrid1.Cells[1, i + 1] := ' Fehler beim Abrufen des Netzwerkstatus';
end;
end;
end;
finally
FreeMem(pIfTable);
end;
end;
end.
Zitat von Fortsetzung der Antwort:
|