![]() |
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Also ich hab jetzt mal provisorisch ein kleines Testprogramm geschrieben und muss erstmal sagen es funktioniert schonmal soweit. Allerdings wird zur Zeit nur ein Adapter ausgegeben. Irgendwas stimmt mit der For-Schleife noch nicht.
Was ich im Taskmanger bemerkt habe ist, dass der Arbeitsspeicher mit jedem Zyklus voller wird. Weiß zwar noch nicht genau was aber ich denke mal dass ich nach jedem Aufruf noch etwas reseten bzw. nullen sollte.
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, WinSock, ActiveX, ComObj, ExtCtrls; type TForm1 = class(TForm) Timer1: TTimer; Panel1: TPanel; procedure Timer1Timer(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Timer1Timer(Sender: TObject); var wmi : variant; wmiService : variant; nicstatus : variant; card : Olevariant; cnt : integer; Enum: IEnumVariant; P : IUnknown; F : Cardinal; connected : integer; status : string; begin WMI:=CreateOleObject('WbemScripting.SWbemLocator'); wmiService := wmi.ConnectServer('.', 'root\wmi'); nicstatus := wmiService.InstancesOf('MSNdis_MediaConnectStatus'); p := nicstatus._NewEnum; p.QueryInterface(IEnumVariant, Enum); for cnt := 0 to nicstatus.Count - 1 do begin Enum.Next(1, card, F); connected := card.NdisMediaConnectStatus; if (connected = 0) then Status := 'verbunden' else Status := 'nicht verbunden'; Panel1.Caption := card.InstanceName + ' : ' + status; //ShowMessage(card.InstanceName + ' : ' + Status); end; end; end. |
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Zitat:
|
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Zitat:
Eine andere Sache ist, dass mir nur ein Adapter angezeigt wird und dieser ist je nach System willkürlich. Dies sollte doch eigentlich die For-Schleife erledigen doch leider ist dem nicht so. |
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Du instanziierst mit
Delphi-Quellcode:
innerhalb eines Timer ein Objekt; logisch, dass irgendwann der Speicher vollläuft, wenn Du das Objekt nicht wieder zerstörst!
WMI:=CreateOleObject('WbemScripting.SWbemLocator');
Du hast nun zwei Möglichkeiten: 1. Du erzeugst die Objektinstanz außerhalb des Timers, und damit nur ein einziges Mal (z.B. beim Erzeugen der Form) und greifst im Timer auf dieses Objekt zu. Beim Zerstören der Form gibst Du das Objekt wieder frei. 2. Du erzeugst das Objekt wie bisher im Timer, gibst es aber auch dort wieder frei. Ich weiß nicht genau, was Dein Code tun soll, daher weiß ich nicht, was für Dich das Richtige ist. Intuitiv würde ich allerdings zu Alternative #1 tendieren. |
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
ok das klingt verständlich. Also mein Programm soll später ständig im Hintergrund laufen und demnach so wenig Ressourcen wie möglich benötigen.
Welche der beiden von dir vorgeschlagenen Möglichkeiten ist denn ressourcenschonender? Es gilt den LAN-Adapter ständig nach einem eingesteckten Kabel abzufragen. Sobald dies der Fall ist kommt der zweite Teil des Programms. Es soll nach einer Eingabeaufforderung auf Wunsch die aktive WLAN-Verbindung getrennt und erst dann die LAN-Verbindung aufgebaut werden. |
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Also irgendwie schaffe ich das nicht das Object nach draußen zu verlagern bzw. die Objektinstanz nach draußen zu verlagern. habe es mit einer neuen Prozedur versucht aber dann bekomme ich beim Aufruf in der jetzigen einen Operationsfehler. Kannst du mir bitte mal sagen wie du das genau meinst mit den beiden Möglichkeiten?
|
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Habe jetzt folgenden optimierten Quellcode der mir anzeigt ob sämtliche Netzwerkadapter im System verbunden sind oder nicht.
Genutzt wird ja WMI (MSNdis_MediaConnectStatus). Ich möchte allerdings nur einen der Netzwerkadapter überprüfen. Wie schaffe ich es gezielt diesen einen zu überprüfen und die anderen zu ignorieren? Letztendlich soll nur der LAN-Adapter überprüft werden udn WLAN, WAN & Co ignoriert werden.
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var wmi : OleVariant; wmiService : variant; nicstatus : Olevariant; card : Olevariant; cnt : integer; Enum: IEnumVariant; P : IUnknown; F : Cardinal; connected : integer; status : string; begin Listbox1.Items.BeginUpdate; try ListBox1.clear; WMI:=CreateOleObject('WbemScripting.SWbemLocator'); try wmiService := wmi.ConnectServer('.', 'root\wmi'); nicstatus := wmiService.InstancesOf('MSNdis_MediaConnectStatus'); try p := nicstatus._NewEnum; p.QueryInterface(IEnumVariant, Enum); for cnt := 0 to nicstatus.Count - 1 do begin Enum.Next(1, card, F); try connected := card.NdisMediaConnectStatus; if (connected = 0) then begin Status := 'verbunden'; end else begin Status := 'nicht verbunden'; end; ListBox1.Items.Add( card.InstanceName + ' : ' + status); finally card := unassigned; end; end; finally nicstatus := unassigned; end; finally wmi := unassigned; end; finally Listbox1.Items.EndUpdate; end; end; |
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Hat sich erledigt...
Falls es jemanden interessiert. Einfach die Bezeichnugn der jeweiligen Instanz verwenden und z.B. in eine Verzweigung einbauen
Delphi-Quellcode:
card.InstanceName = '3com PCI Fast Ethernet Adapter (rev.C)'
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:20 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