AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Feststellen, ob Netzwerkkabel gezogen wurde?
Thema durchsuchen
Ansicht
Themen-Optionen

Feststellen, ob Netzwerkkabel gezogen wurde?

Ein Thema von raffix · begonnen am 24. Mär 2003 · letzter Beitrag vom 2. Jun 2008
Antwort Antwort
Seite 11 von 11   « Erste     91011   
Tod787

Registriert seit: 19. Mai 2008
99 Beiträge
 
#101

Re: Feststellen, ob Netzwerkkabel gezogen wurde?

  Alt 28. Mai 2008, 14:40
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.
  Mit Zitat antworten Zitat
s-off
(Gast)

n/a Beiträge
 
#102

Re: Feststellen, ob Netzwerkkabel gezogen wurde?

  Alt 28. Mai 2008, 14:49
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
  Mit Zitat antworten Zitat
Tod787

Registriert seit: 19. Mai 2008
99 Beiträge
 
#103

Re: Feststellen, ob Netzwerkkabel gezogen wurde?

  Alt 28. Mai 2008, 19:06
Zitat von s-off:
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
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.
  Mit Zitat antworten Zitat
s-off
(Gast)

n/a Beiträge
 
#104

Re: Feststellen, ob Netzwerkkabel gezogen wurde?

  Alt 28. Mai 2008, 20:01
Du instanziierst mit
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.
  Mit Zitat antworten Zitat
Tod787

Registriert seit: 19. Mai 2008
99 Beiträge
 
#105

Re: Feststellen, ob Netzwerkkabel gezogen wurde?

  Alt 28. Mai 2008, 20:47
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.
  Mit Zitat antworten Zitat
Tod787

Registriert seit: 19. Mai 2008
99 Beiträge
 
#106

Re: Feststellen, ob Netzwerkkabel gezogen wurde?

  Alt 29. Mai 2008, 19:49
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?
  Mit Zitat antworten Zitat
Tod787

Registriert seit: 19. Mai 2008
99 Beiträge
 
#107

Re: Feststellen, ob Netzwerkkabel gezogen wurde?

  Alt 2. Jun 2008, 11:57
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;
  Mit Zitat antworten Zitat
Tod787

Registriert seit: 19. Mai 2008
99 Beiträge
 
#108

Re: Feststellen, ob Netzwerkkabel gezogen wurde?

  Alt 2. Jun 2008, 14:46
Hat sich erledigt...


Falls es jemanden interessiert. Einfach die Bezeichnugn der jeweiligen Instanz verwenden und z.B. in eine Verzweigung einbauen

card.InstanceName = '3com PCI Fast Ethernet Adapter (rev.C)'
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 11 von 11   « Erste     91011   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:05 Uhr.
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