Delphi-PRAXiS
Seite 11 von 11   « Erste     91011   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Feststellen, ob Netzwerkkabel gezogen wurde? (https://www.delphipraxis.net/3672-feststellen-ob-netzwerkkabel-gezogen-wurde.html)

Tod787 28. Mai 2008 13:40

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.

s-off 28. Mai 2008 13:49

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
Zitat:

Zitat von Tod787
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.

Ich denke mal, dass Dein Speicher keine WMIs mehr mag :mrgreen:

Tod787 28. Mai 2008 18:06

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
Zitat:

Zitat von s-off
Zitat:

Zitat von Tod787
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.

Ich denke mal, dass Dein Speicher keine WMIs mehr mag :mrgreen:

Und wie bekomme ich das in den Griff?

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.

s-off 28. Mai 2008 19:01

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
Du instanziierst mit
Delphi-Quellcode:
WMI:=CreateOleObject('WbemScripting.SWbemLocator');
innerhalb eines Timer ein Objekt; logisch, dass irgendwann der Speicher vollläuft, wenn Du das Objekt nicht wieder zerstörst!

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.

Tod787 28. Mai 2008 19:47

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.

Tod787 29. Mai 2008 18:49

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?

Tod787 2. Jun 2008 10:57

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;

Tod787 2. Jun 2008 13:46

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 01:18 Uhr.
Seite 11 von 11   « Erste     91011   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz