Delphi-PRAXiS
Seite 3 von 3     123   

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)

justify 14. Jun 2005 18:21

Hallo,

es funktioniert. Hab's gerade ausprobiert.

Vielen herzlichen Dank für die Mühe, die Du mir gemacht hast! :-D

Nee, aber mal echt: Ist echt lieb von Dir, danke!

toyoman 14. Jun 2005 18:24

Zitat:

Zitat von justify
Hallo,

es funktioniert. Hab's gerade ausprobiert.

Vielen herzlichen Dank für die Mühe, die Du mir gemacht hast! :-D

Nee, aber mal echt: Ist echt lieb von Dir, danke!

kein Problem, wenn man den Code grad so rumliegen hat :)

justify 15. Jun 2005 18:43

Guten Abend!

Vorfreude ist doch die schönste Freude! :)

Es klappt jetzt nicht mehr, hatte gestern das Netzwerk nicht aktiviert und er zeigt einfach nur an, daß es nicht verbunden ist, egal, ob es aktiv ist oder nicht.

Was nun?

justify 15. Jun 2005 19:11

Hallo nochmal,

sag' mal, toyoman: Könnte es sein, daß die Funktion nur überprüft, ob der Netzwerkstecker eingesteckt ist und nicht, ob auch eine aktive Netzwerkverbindung besteht?

Weil ich brauche 'ne Funktion, die testet, ob eine Netzwerkverbindung hergestellt mit einem anderen Rechner ist, oder nicht.

toyoman 15. Jun 2005 19:15

Zitat:

Zitat von justify
Hallo nochmal,

sag' mal, toyoman: Könnte es sein, daß die Funktion nur überprüft, ob der Netzwerkstecker eingesteckt ist und nicht, ob auch eine aktive Netzwerkverbindung besteht?

Weil ich brauche 'ne Funktion, die testet, ob eine Netzwerkverbindung hergestellt mit einem anderen Rechner ist, oder nicht.

hi!

diese Funktion prüft wirklich nur ob das Netzwerkkabel gesteckt ist oder nicht.
Ob eine Netzwerkverbindung hergestellt ist oder nicht ist recht kompliziert zu prüfen vorallem weil in heutigen Laptops mehrere Netzwerkadapter fest drin sind. Z.b. Netzwerkadapter, Wireless LAN Adapter etc.
Da wirst du um eine komplexe Prozedur nicht herumkommen, welche di einzelnen Adapter aus der Registry ausliest und abcheckt ob eine Verbindung besteht bzw. einen Ping ausführt.

Gruss

justify 15. Jun 2005 19:39

Gut zu wissen.

Aber selbst da ist ein Fehler, denn mein Stecker ist drinne und trotzdem zeigt er an, daß er nicht eingesteckt ist.

toyoman 16. Jun 2005 05:53

Zitat:

Zitat von justify
Gut zu wissen.

Aber selbst da ist ein Fehler, denn mein Stecker ist drinne und trotzdem zeigt er an, daß er nicht eingesteckt ist.

Bei mir in der Firma funktioniert das einwandfrei. Was für eine Netzwerkverbindung ist das? DHCP oder fixe IP?
Wieviele Netzwerkadapter und welche sind aktiviert?

MexDelphi 16. Jun 2005 11:05

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
Hallo zusammen :)

eine kleine Abwandlung des Codes von toyoman ..

Code:
function NetworkConnect(AdapterNr : Integer) : Boolean;
var
  reg : TRegistry;
  i : Integer;
  NetworkCards : String;
begin
result := false;
reg := TRegistry.Create(KEY_READ);
reg.RootKey := HKEY_LOCAL_MACHINE;

if reg.KeyExists('\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards\' +inttostr(AdapterNr)) = true then
  begin
  reg.OpenKey('\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards\' +inttostr(AdapterNr),false);
  NetworkCards := reg.ReadString('ServiceName');
  // break;
  if NetworkCards <> '' then
    begin
    reg.OpenKey('\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\'+NetworkCards,false);
    if reg.ValueExists('DHCPRetryStatus') then
      begin
      result := true;
      end;
    end;
  end;
reg.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  AdptNr : Integer;
begin
for AdptNr := 0 to 5 do
  begin
  if networkconnect(AdptNr) = true
    then showmessage('Netwerkkarte Nr.: '+ IntToStr(AdptNr) + ' hat Kontakt :)')
    else showmessage('Netwerkkarte Nr.: '+ IntToStr(AdptNr) + ' ist entfernt :(');
  end;
end;
sollte auf allen XP laufen :)

justify 17. Jun 2005 12:05

Hallo!

Ja, unter XP Professional läuft's auch einwandfrei, aber unter allen anderen Betriebssystemen gibt's Probleme.

Wir haben nun eine andere Variante angewendet.

Allerdings funktioniert nocht nicht alles so, wie es soll.

Als nächstes muß das OS ermittelt werden, um dann eine entsprechende Prozedur od. Funktion aufzurufen.

Wer kann helfen?

fkerber 18. Jun 2005 17:36

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
Hi!

Hast du mal hier im Forum gesucht?
Ich glaube, da mal was dazu gefunden gehabt zu haben ;)

Ciao Frederic

Tod787 25. Mai 2008 11:41

Hi, würde gerne mal die hier geposteten Codes ausprobieren da ich ein ähnliches Problem lösen möchte. Leider schaff ich es nicht den COde zu übersetzen. Benutze Delphi2006 und beim Compilieren kommt die Meldung "Field Form1.Button1 does not have a corresponding component. Remove the declaration?" Als Projekt habe ich New VCL Forms Application genommen.

Verwendet habe ich z.B. den Code von toyoman

[quote="toyoman"]
Zitat:

Zitat von justify

Würde sagen so müssts gehn:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, registry, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
function NetworkConnect : Boolean;
var
  reg : TRegistry;
  i : Integer;
  NetworkCards : String;
begin
  result := false;
  reg := TRegistry.Create(KEY_READ);
  reg.RootKey := HKEY_LOCAL_MACHINE;
  for i := 0 to 15 do //Mehr als 15 Netzwerkkarten sollte kein normaler Rechner haben...
  begin
    if reg.KeyExists('\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards\' +inttostr(i)) = true then
    begin
      reg.OpenKey('\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards\' +inttostr(i),false);
      NetworkCards := reg.ReadString('ServiceName');
     // break;
      if NetworkCards <> '' then
      begin
        reg.OpenKey('\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\'+NetworkCards,false);
        if reg.ReadString('DHCPDomain') <> '' then
        begin
            result := true
        end else
        begin
            result := false;
        end;
      end;
    end;
  end;
  reg.Free;
end;
begin
  // Network Cable unplugged?
   if networkconnect=true then
   begin
      showmessage('Netzwerkkabel ist eingesteckt!');
   end else
   begin
      showmessage('Netzwerkkabel ist ausgesteckt!');
   end;
end;

end.


toyoman 26. Mai 2008 07:44

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
hast du denn ein Form1 und einen Button1 auf dem Form drauf?

Luckie 26. Mai 2008 08:02

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
Lösch mal Zeile 11 und 26.

Tod787 26. Mai 2008 08:42

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
@toyoman,
vielen Dank! Hatte den Button nicht drauf. Nur jetzt wo ich ihn drauf habe kommt keine Fehlermeldung jedoch zeigt er mir keinen Status an ob das Kabel gesteckt ist oder nicht.

Da ich erst angefangen habe mich mit Delphi auseinanderzusetzen kann es gut möglich sein dass es sich um Basics handelt. Bin aber parallel dabei mich einzuarbeiten.

@Luckie
Auch erstmal danke für die Beteiligung! hab ich gerade mal versucht. Musste dann allerdings noch zusätzlich Zeile 67 und 12 löschen. Allerdings kommt dann die Meldung "Netzwerkkabel ist ausgesteckt" obwohl es doch eingesteckt ist. Getestet momentan mit WinXP SP2.

soulies 26. Mai 2008 08:56

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
hoi,

wahrscheinlich liefert die Funktion immer 'False'
weil bei dir in der Registry der Parameter 'DHCPDomain'
gar nicht existiert bei deinem netzwerk-adapter


cya

Tod787 26. Mai 2008 09:11

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
Also der Parameter ist vorhanden. Habe fünf Ordner im Registryordner "Interfaces" und in einem dieser ist mein LAN-Adapter mit sämtlichen DHCP-Einstellungen sowie 'DHCPDomain' vorhanden. Sollte doch eigentlich so stimmen, oder?
Habe auch schon versucht die IP manuell zu vergeben, weil ich mir dachte dass diese Abfrage nur für aktiviertes DHCP gilt. Allerdings kommt hier auch wieder LAN-Kabel nicht gesteckt.

Tod787 28. Mai 2008 11:05

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
Stichwort Mediasensing....

habe unter http://www.ndis.com/faq/QA01050301/default.htm den bereits erwähnten Weg gefunden unter Win2k eine Abfrage über den Verbindungsstatus der Netzwerkkarte zu machen. In der Klasse MSNdis_MediaConnectStatus gibt es für jeden Netzwekadapter NdisMediaStateConnected. Bei 0 besteht eine Verbindung und bei 1 eben nicht. Habe das Ganze mit dem WMI-Tester unter Win2k SP4 erfolgreich getestet.

Jetzt habe ich auch eine Funktion gefunden die das ganze Abfragen soll doch leider bringt mir der Compiler 2 nicht deklarierte Bezeichner (IEnumVariant, CreateOleObject) und dass IEnumVariant kein Element "Next" enthält. Ich vermute mal dass ich noch was einbinden muss aber schaut es euch lieber selbst mal an!
(Quelle der Funktion: http://www.experts-exchange.com/Prog..._21072409.html)

Delphi-Quellcode:
procedure ShowNetworkStatus;
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 := 'connected'
        else
         Status := 'network cable unplugged';
     ShowMessage(card.InstanceName + ' : ' + Status);
   end;
end;
Ziel soll es letztendlich sein auf einem System mit zwei Netzwerkkarten (1xLAN und 1xWLAN) zu erkennen ob ein Lan-Kabel gesteckt wurde um danach abfragen zu können ob gewechselt werden soll. Demnach fällt bei mir die Localhostabfrage weg da dieser bei getrennter LAN und gleichzeitig vorhandener WLAN-Verbindung dieser nicht vorhanden ist.

spaxxn 28. Mai 2008 11:26

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
Binde mal die Units "ComObj" und "ActiveX" ein

Tod787 28. Mai 2008 11:51

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
Danke spaxxn das wars. Jetzt hängt es allerdings beim Aufrufen der procedure
Zitat:

[Pascal Fehler] Unit1.pas(15): E2065 Ungenügende Forward- oder External-Deklaration: 'TForm1.ShowNetworkStatus'
Bin noch bissi frisch hinter den Ohren, sodass es wohl zu 99% ein Syntaxfehler sein wird.

Edit: Ok habe es dann doch selbst entdeckt :) hatte statt procedure xxx.yyyy nur procedure yyyy stehen gehabt.

spaxxn 28. Mai 2008 11:57

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
Edit: Ich schlaf noch

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 20:22 Uhr.
Seite 3 von 3     123   

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