Delphi-PRAXiS
Seite 2 von 3     12 3      

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)

NicoDE 11. Jul 2004 10:34

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
Zitat:

Zitat von novabeat
unter WinME gehts gar nicht.

Ist WMI überhaupt installiert?

djmasi 11. Jul 2004 10:35

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
War gerade auf der MSDN Seite und laut der ist WMI in ME, 2000 und XP standardmäßig dabei. Nur bei 98, 95 und NT gibt's extra Downloads


[edit]
Aber probier doch mal die WMI Tools.
Wenn die laufen starte mal den WMI Object Browser (geht nur mit IE :evil: ) und schau mal unter Win32_SystemDevices.PartComponent -> Win32_NetworkAdapter. Du erhälst da eine Übersicht über alle NetDevices. Rein theoretisch müßte unter ME NetConnectionID und NetConnectionStatus <empty> stehen. Mit dem letzteren kann man sagen ob NW-Kabel drinnen oder nicht.

djmasi 11. Jul 2004 22:08

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
Liste der Anhänge anzeigen (Anzahl: 1)
So hab mich nochmal rangesetzt und was geändert.

Hab jetzt Funktionen genommen, die rein theoretisch unter allen Windows-Versionen laufen sollten, vorausgesetzt WMI ist installiert.

Bugs, Kritik und Verbesserungsvorschläge nehme ich gerne entgegen.

MrKnogge 11. Jul 2004 22:25

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
Was bringt dir eine funktion, wenn du dafür ein fremdes Programm benötigst ?

djmasi 11. Jul 2004 22:46

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
Ist auf jeden Fall ein gutes Argument, nur leider ist das bis jetzt die "sicherste" und "zuverläsigste" Lösung die ich gefunden habe. Ich weiß dass es noch viel 98/ME-User gibt, dehalb habe ich versucht Funktionen zu nehmen, die auch von diesen unterstützt werden. Mir macht das nix aus unter XP. Aber ich will ja dass mein Prog erstmal auf jedem Windows läuft. Leider kann ich das im Moment nicht testen da mir die Zeit fehlt ein oder zwei zusätzliche Systeme zum testen aufzubauen. Deshalb bin ich auf eure Hilfe angewiesen.

Aber MrKnogge, wenn du 'ne andre Idee hast das umzusetzen, ich bin ganz Ohr und einige andre sicher auch :-D

NicoDE 11. Jul 2004 23:39

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von djmasi
Ich weiß dass es noch viel 98/ME-User gibt, dehalb habe ich versucht Funktionen zu nehmen, die auch von diesen unterstützt werden. Mir macht das nix aus unter XP. Aber ich will ja dass mein Prog erstmal auf jedem Windows läuft. Leider kann ich das im Moment nicht testen da mir die Zeit fehlt ein oder zwei zusätzliche Systeme zum testen aufzubauen. Deshalb bin ich auf eure Hilfe angewiesen.

Um es auf den 'alten' Systemen zum Laufen zu bekommen, solltest Du die niedrigste TLB-Version importieren, die Du unterstützen willst.

Anbei die älteste Version die ich noch habe...

djmasi 12. Jul 2004 10:04

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
Ich muss dich leider enttäuchen :cry: , aber nachdem ich deine Typenbibliothek installiert habe bekomme ich immer noch alle Informationen von XP. Durch die importierte TLB stelle ich ja eine Verbindung zu der DLL dar, über Funktionen. Also eine Schnittstelle. Diese sind im allgemeinen gleich geblieben (die von mir benötigten haben sich nicht geändert). Aber die Eigenschaften, die ich abrufen kann über WMI, hängen von der WMI-Version ab und nicht von der TLB! Das einzige was mir jetzt spontan einfällt ist, vorher den WMI-Status, dann die WMI-Version abzufragen und dann zu entscheiden welche Daten ich abfragen kann. Das heißt bei XP einfach NetConnectionStatus und bei anderen dann den umständlichen Weg über MAC -> IP=0.0.0.0? usw.

Wäre schön wenn es so einfach gewesen wäre :?

GFMTS 12. Jul 2004 11:45

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
Moin!

Also ich arbeite auch mit Ping bei der "Serverüberwachung" (aus Delphi heraus).
Ebenso hatte ich Bedenken, was die Netzlast betrifft.

Jetzt schicke ich alle 5 Minuten 10 Pings ab und entscheide anhand der verlorenen
Päckchen, was zu tun ist. In diesem häßlichen Netzwerk sind 3 verlorene Päckchen
eine Info, 5 eine Warnung und ab 7 wird es kritisch (unter Berücksichtigung der
Zeit).

Da solltest Du Dir also keine Sorgen von wegen der Netzlast machen - denke ich...

djmasi 12. Jul 2004 12:41

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
Leider benötige ich die Info sofort (ok 5 Sekunden Tolleranz), da ich sofort reagieren möchte/muss, wenn die Verbindung verloren geht.

GFMTS 12. Jul 2004 12:47

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
Zitat:

Zitat von djmasi
Leider benötige ich die Info sofort (ok 5 Sekunden Tolleranz), da ich sofort reagieren möchte/muss, wenn die Verbindung verloren geht.

Hm, dann wüßte ich die Lösung auch gern...(da Client/Server in dem Falle ausfällt)...

DaFox 12. Jul 2004 13:13

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
Hi,

die ultimative Lösung habe auch ich nicht. Aber hast Du schon mal folgende Funktionen angeschaut?
MSDN-Library durchsuchenIsNetworkAlive, MSDN-Library durchsuchenIsDestinationReachable

Gruß,
Markus

djmasi 12. Jul 2004 14:59

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
@DafOx: hast du schonmal damit gearbeitet? Wollte gerade die Sensapi.dll einbinden, aber Delphi brachte mir eine Fehlermeldung, dass es nicht ginge ("Fehler beim Laden der Typbibliothek/DLL").
Hab ich vielleicht was übersehen? :?:

NicoDE 12. Jul 2004 15:09

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
Zitat:

Zitat von djmasi
Ich muss dich leider enttäuchen :cry: , aber nachdem ich deine Typenbibliothek installiert habe bekomme ich immer noch alle Informationen von XP. Durch die importierte TLB stelle ich ja eine Verbindung zu der DLL dar, über Funktionen. Also eine Schnittstelle. Diese sind im allgemeinen gleich geblieben (die von mir benötigten haben sich nicht geändert).

Ich weiss nicht mit welcher Version Du arbeitest, aber ich konnte mit der importierten Version 1.0 der TLB *nicht* mehr kompilieren (unbekannte Konstante - das war auch der Grund warum schon das Connect zu WMI unter Win9x fehlschlug ($80041008))...
Zudem gibt es die NetworkConnectionID ubd NetworkConnectionStatus unter WinSE nicht...

djmasi 12. Jul 2004 15:17

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
Also ich hab deine genommen :?

Aber vielleicht liegt es ja noch an der DLL? Kannst du deine mal noch mit posten?

NicoDE 12. Jul 2004 15:37

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
Zitat:

Zitat von djmasi
Kannst du deine mal noch mit posten?

http://www.bendlins.de/temp/wbem-1.0_winse.zip
( ps: befinden sich unter WIn9x in %windir%\system\WBEM )


Zum Beitrag oben, IsNetworkAlive() liefert immer noch LAN zurück wenn das Kabel längst gezogen wurde...
Delphi-Quellcode:
const
  NETWORK_ALIVE_LAN = $00000001;
  NETWORK_ALIVE_WAN = $00000002;
  NETWORK_ALIVE_AOL = $00000004;

function IsNetworkAlive(out Flags: DWORD): BOOL; stdcall;
  external 'sensapi.dll' name 'IsNetworkAlive';

procedure TForm1.Button1Click(Sender: TObject);
var
  Flags: DWORD;
  Text: string;
begin
  Text := 'IsNetworkAlive: ';
  if not IsNetworkAlive(Flags) then
    Text := Text + '<offline>'
  else
  begin
    if (Flags and NETWORK_ALIVE_LAN) = NETWORK_ALIVE_LAN then
      Text := Text + 'LAN, ';
    if (Flags and NETWORK_ALIVE_WAN) = NETWORK_ALIVE_WAN then
      Text := Text + 'WAN, ';
    if (Flags and NETWORK_ALIVE_AOL) = NETWORK_ALIVE_AOL then
      Text := Text + 'Looser, ';
    Text := Text + '...';
  end;
  ShowMessage(Text);
end;

djmasi 12. Jul 2004 16:07

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
Zitat:

Zitat von NicoDE
Zum Beitrag oben, IsNetworkAlive() liefert immer noch LAN zurück wenn das Kabel längst gezogen wurde...

Warum? Bei mir funktionierts :gruebel:

Reaktionszeit < 1 Sekunde :-D

PS: Danke nochmal für die Dateien und den Code

djmasi 12. Jul 2004 16:27

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
Ähm, hab ich jetzt 'nen Denkfehler? Weil wenn ich
Delphi-Quellcode:
function IsDestinationReachable(Destination: String): BOOL; stdcall;
  external 'sensapi.dll' name 'IsDestinationReachable';
einbinde, sagt mir Delphi, "der Prozedureinstiegspunkt wurde nicht gefunden". Aber laut MSDN heißt die Funktion doch so.

Ich dreh hier gleich durch :wall:

DaFox 12. Jul 2004 17:00

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
Hi.

Delphi-Quellcode:
PQOCInfo = ^TQOCInfo;
TQOCInfo = record
  dwSize: Integer;
  dwFlags: Integer;
  dwInSpeed: Integer;
  dwOutSpeed: Integer;
end;

function IsDestinationReachable(Destination: PChar; QOCInfo: pQOCInfo): BOOL; stdcall;
  external 'sensapi.dll' name 'IsDestinationReachableA';
Gruß,
Markus

djmasi 12. Jul 2004 17:02

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
Na auf das A muss man erstmal kommen. Danke :-D

p0w3r5tr34m3r 12. Jul 2004 17:04

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
ne ganz einfache möglichkeit is (die supermuckl und ich eben herrausgefunden haben), ping einfach alle netzwerkkarten von dir an.. wenn das kabel gezogen ist, deaktiviert sich die karte und die ip existiert somit nicht mehr!

das klappt auf allen 5 rechnern hier, also warum nicht auch bei dir / euch !?


MfG Powerstreamer

djmasi 12. Jul 2004 17:57

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
Liste der Anhänge anzeigen (Anzahl: 1)
So, ich hoffe mal dass wir es jetzt geschafft haben. :zwinker:

Also die Erkennung läuft über IsNetworkAlive.
  • Kommt ohne Verzögerung.
  • Systemlast ist minimal.
Genauso wollte ich das :-D

Projekt ist wieder anbei. Ich bitte wie immer um Berichte von Nicht-XP-Usern :wink:

Danke

NicoDE 12. Jul 2004 18:16

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
Zitat:

Zitat von djmasi
  • Kommt ohne Verzögerung.
  • Systemlast ist minimal.

Windows XP, DNS (und alternative Konfiguration), NAT, transparenter Proxy:
- Kabel drin: IsNetworkAlive True, DestinationAvailable True
- Kabel wech: IsNetworkAlive True, DestinationAvailable False

djmasi 12. Jul 2004 18:19

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
:wall: ach menno :cry:

Hast du vielleicht mehr als eine Netwerkkarte?

NicoDE 12. Jul 2004 18:30

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
Zitat:

Zitat von djmasi
Hast du vielleicht mehr als eine Netwerkkarte?

Sorry, liegt an VMware (virtuelles Netzwerk)... Windows glaubt deswegen noch 'online' zu sein :)

djmasi 12. Jul 2004 19:27

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
Und ich dachte schon es liegt an mir :mrgreen:

Hab jetzt 3 XP Rechner und 1 Server 2003 ausprobiert. Funktioniert tadellos ,außer beim Server das IsDestinationReachable. Warum weiß ich noch nicht.

Ich warte weiter auf Berichte, vor allem nicht-XP-User :hi:

NicoDE 12. Jul 2004 19:53

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
Zitat:

Zitat von djmasi
außer beim Server das IsDestinationReachable.

Der wird sich berechtigterweise darüber beschweren, dass TQOCInfo.dwSize nicht initialisiert ist...

djmasi 12. Jul 2004 20:05

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
:wall: Mein Fehler
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var QOCInfo: TQOCInfo;
begin
  Memo1.Clear;
  QOCInfo.Size := 16; //Bitte das einfügen
  if CheckBox1.Checked then
    if Edit1.Text <> '' then

DaFox 12. Jul 2004 20:11

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
@Nico: Nur rein aus Interesse: Weißt da was hinter den Kulissen passiert, wenn der Balloon-Hint "Das Netzwerkkabel wurde entfernt" erscheint (Stichwort: IDA :mrgreen: )? Polling? Was wird gepollt?

Gruß,
Markus

DaFox 12. Jul 2004 20:14

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
Zitat:

Zitat von djmasi
:wall: Mein Fehler
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var QOCInfo: TQOCInfo;
begin
  Memo1.Clear;
  QOCInfo.Size := 16; //Bitte das einfügen
  if CheckBox1.Checked then
    if Edit1.Text <> '' then

Oder besser das hier
Delphi-Quellcode:
QOCInfo.dwSize := SizeOf(TQOCInfo);
einfügen.

Gruß,
Markus

Tubos 30. Sep 2004 15:44

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
Der Code mit IsNetworkAlive hat vor 3 Wochen auf WinXP Prof. noch problemlos funktioniert (schnell, liefert praktisch ohne Verzögerung "Netzwerkkabel gezogen").
Jetzt geht er nicht mehr... :pale:
DestinationReachable auf 192.168.0.1 (die Adresse meines Computers) liefert "Keine Netzwerkverbindung" obwohl ein normaler Ping funktioniert.
Die WAN-Verbindung wird aber noch erkannt.
An meinem Programm liegt der Fehler sicher nicht da ich es auch mit dem beigelegten Beispielprogramm ausprobiert habe.
Wären nett wenn das irgendein SP2-User noch testen könnte, ich glaube aber nicht dass es daran liegt weil ich es damals auch schon hatte (glaube ich zumindest... :gruebel: )

Unter Windows 2000 Prof. (SP4), wo ich ein Programm mit dieser Funktion verwenden will, hat der Code nie funktioniert.

djmasi 30. Sep 2004 17:35

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
Also ich hab XP SP2 und es funktioniert ohne Probleme. Unter 2000 SP3 lief es auch (glaub ich jedenfalls). Nur unter 98/ME läuft es nicht. Aber mit SP4 für 200 probier ich nochmal.

Das ganze kommt ja aus der sensapi.dll. Schau mal was du für ne Version hast

Tubos 30. Sep 2004 19:58

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
Wie finde ich heraus welche Version ich habe?

Ich glaube nicht dass es daran liegt wenn du auch das SP2 hast und es bei dir funktioniert.

Bei Windows 2000 geht es jetzt aber!
Dann hat sich das Problem erledigt weil ich es nur fürs 2000er brauche.

fkerber 30. Sep 2004 20:35

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
Hi!

Zitat:

Zitat von Tubos
Wie finde ich heraus welche Version ich habe?

Normalerweise Rechtsklick auf die Datei, Eigenschaften, Registerkarte Version. Dann sollte es irgendwo dabei stehen.


Ciao Frederic

Tubos 2. Okt 2004 13:03

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
Ich habe mich geirrt, der Code funktioniert doch nicht unter Windows 2k und liefert immer "LAN" auch wenn gar keine Verbindung vorhanden ist.

Und unter Windows XP funktioniert er wieder ... verrückt! :roll:

Die sensapi.dll-Version auf dem Windows-2000-PC ist 5.0.2195.6627.

Tubos 21. Okt 2004 19:22

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
Ich bins wieder.

Es funktioniert doch unter Win2k!

Allerdings beträgt die Verzögerung etwa 5 Minuten.
Mein Bruder hat das Kabel rausgezogen, und nach 5 Minuten hat er sich beschwert dass der Computer nicht mehr geht.
Danach hat er wieder 5 min warten müssen bis es wieder gegangen ist.

Das hat er sich gemerkt, jetzt zieht er es nicht mehr raus :firejump: :stupid:

mfg. Tubos

toyoman 25. Feb 2005 08:00

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
Zitat:

Zitat von djmasi
Hab's geschafft! Nach langem hin- und her hab ich die WMI zum laufen bekommen. Es werden jetzt alle Netzwerkadapter ausgegeben, die auch in "Netzwerkverbindungen" stehen, deren MAC-Adresse und Status (Connected/NOT Connected).

Probiert es mal bitte unter anderen OS als XP/SP1 aus und postet mal die Resultate.

Delphi-Quellcode:
unit UNetWMI;

interface

uses
   // Delphi VCL Units
   Classes, Variants;

   // external forward declarations
   function getSystemMACAddresses: TStringList;

implementation

uses
   // Delphi VCL Units
   Windows,
   Dialogs,
   ComObj,
   ActiveX,
   // Imported type libraries
   WbemScripting_TLB;  { Typelib name: "Microsoft Windows WMI Scripting V1.2 Library" }

const
   // define used constants
   WMI_LOCAL_COMPUTER  = '.';
   WMI_SYSTEM_NAMESPACE = 'root\CIMV2';
   WMI_CLASS_NIC       = 'Win32_NetworkAdapter';
   WMI_ATTRIB_ADAPTER  = 'AdapterType';
   WMI_ATTRIB_AVAILAB  = 'NetConnectionID';
   WMI_ATTRIB_CONNSTAT = 'NetConnectionStatus';
   WMI_ATTRIB_MAC      = 'MACAddress';
   WMI_ATTRIB_NAME     = 'Name';

// retrieve System MAC Addresses via WMI
//
function getSystemMACAddresses: TStringList;
var
   l_WMILocator:         ISWbemLocator;    // Locator, gets Services
   l_WMIServices:        ISWbemServices;   // Services, gets Object Definitions
   l_WMIObjectDefinition: ISWbemObject;     // Definition, gets Set of Objetcs
   l_WMIObjectSet:       SWbemObjectSet;   // ObjectSet, gets Enum over Instances
   l_WMIObjectInstances: IEnumVariant;     // Enum of Instances, gets Object
   l_WMIObject:          ISWbemObject;     // Object, gets Sets of his properties
   l_WMIPropertySet:     ISWbemPropertySet; // PropertySet, gets single property
   l_WMIProperty:        ISWbemProperty;   // Property, gets Value

   l_TempObj:            OleVariant;       // temporary used values
   l_ObjValue:           Cardinal;
begin
   // create the return object
   result := TStringList.Create;

   // retrieve object enum through WMI classes
   l_WMILocator := CoSWbemLocator.Create;
   l_WMIServices := L_WMILocator.ConnectServer(WMI_LOCAL_COMPUTER, WMI_SYSTEM_NAMESPACE, '', '', '', '', 0, nil);
   l_WMIObjectDefinition := l_WMIServices.Get(WMI_CLASS_NIC, wbemFlagUseAmendedQualifiers, nil);
   l_WMIObjectSet := l_WMIObjectDefinition.Instances_(0, nil);
   l_WMIObjectInstances := (l_WMIObjectSet._NewEnum) as IEnumVariant;

   // iterate through enum values (WbemObjects) and get the property values
   while (l_WMIObjectInstances.Next(1, l_TempObj, l_ObjValue) = S_OK) do
   begin
      l_WMIObject:= IUnknown(l_TempObj) as SWBemObject;

      l_WMIPropertySet := l_WMIObject.Properties_;

      l_WMIProperty := l_WMIPropertySet.Item(WMI_ATTRIB_AVAILAB, 0);
      if not VarIsNull(l_WMIProperty.Get_Value) then
        begin
          result.Add(l_WMIProperty.Get_Value);
          l_WMIProperty := l_WMIPropertySet.Item(WMI_ATTRIB_NAME, 0);
          if not VarIsNull(l_WMIProperty.Get_Value) then
            result.Append(' - '+l_WMIProperty.Get_Value);
          l_WMIProperty := l_WMIPropertySet.Item(WMI_ATTRIB_MAC, 0);
          if not VarIsNull(l_WMIProperty.Get_Value) then
            result.Append(' - '+l_WMIProperty.Get_Value)
          else
            result.Append(' - MAC-Address not available');
          l_WMIProperty := l_WMIPropertySet.Item(WMI_ATTRIB_ADAPTER, 0);
          if not VarIsNull(l_WMIProperty.Get_Value) then
            result.Append(' - '+l_WMIProperty.Get_Value)
          else
            result.Append(' - Network Type not available');
          l_WMIProperty := l_WMIPropertySet.Item(WMI_ATTRIB_CONNSTAT, 0);
          if l_WMIProperty.Get_Value=2 then
            result.Append(' - Status: Connected')
          else
            result.Append(' - Status: NOT Connected');
          result.Add('');
        end;
   end;
end;
end.
Eingebunden wird das dann folgendermaßen:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  ListBox1.Items := getSystemMACAddresses;
end;

Wer die WMI Library braucht, sollte hier vorbeischauen. Aber Achtung, waren circa 323MB zum downloaden.


Anbei mal mein Versuchsprojekt :dp:

hallo

wie läuft das z.b. auf Delphi 2005? hat schon jemand WMI in Delphi 2005 verwendet?
muss ich da gewisse Units von WMI einbinden?

justify 14. Jun 2005 17:43

Guten Abend allerseits!

Nun habe ich mal beide Varianten ausprobiert - sowohl die lange von toyoman, als auch den Dreizeiler, der am Anfang gepostet wurde.

Allerdings habe ich folgendes Problem: toyoman's Variante läuft nur unter NT, der Dreizeiler nur unter XP!

Was nun? Eine Möglichkeit wäre ja festzustellen, welches OS gerade benutzt wird, aber das ist alles ziemlich umständlich.

Gibt's eventuell einen Befehl, mit dem man kurz und knapp abfragen kann, ob man mit dem LAN verbunden ist oder nicht?

Ich meine, um festzustellen, ob man mit dem Internet verbunden ist, geht's auch schnell mit 'nem Befehl, der mir gerade nicht einfällt, aber funktioniert.

Naja, wäre nett, wenn Ihr mal paar Tipps geben könntet.

Schönen Abend noch!

toyoman 14. Jun 2005 18:01

Zitat:

Zitat von justify
Guten Abend allerseits!

Nun habe ich mal beide Varianten ausprobiert - sowohl die lange von toyoman, als auch den Dreizeiler, der am Anfang gepostet wurde.

Allerdings habe ich folgendes Problem: toyoman's Variante läuft nur unter NT, der Dreizeiler nur unter XP!

Was nun? Eine Möglichkeit wäre ja festzustellen, welches OS gerade benutzt wird, aber das ist alles ziemlich umständlich.

Gibt's eventuell einen Befehl, mit dem man kurz und knapp abfragen kann, ob man mit dem LAN verbunden ist oder nicht?

Ich meine, um festzustellen, ob man mit dem Internet verbunden ist, geht's auch schnell mit 'nem Befehl, der mir gerade nicht einfällt, aber funktioniert.

Naja, wäre nett, wenn Ihr mal paar Tipps geben könntet.

Schönen Abend noch!


hey, die variante war nicht von mir sondern von djmasi...

ich benütze in meinen Service diese Funktion (auch irgendwo hier aus dem Forum, bisschen modifiziert):

Delphi-Quellcode:
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
      logfileschreiben('----------------------------------------------------------------------------------------');
      reg.OpenKey('\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards\' +inttostr(i),false);
      NetworkCards := reg.ReadString('ServiceName');
      logfileschreiben('Networkcard ID: '+Networkcards);
      logfileschreiben('Networkcard description: '+reg.readstring('Description'));
     // break;
      if NetworkCards <> '' then
      begin
        reg.OpenKey('\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\'+NetworkCards,false);
        logfileschreiben('DHCP Domain: '+reg.readstring('DhcpDomain'));
        logfileschreiben('DHCP IP: '+reg.readstring('DhcpIPAddress'));
        logfileschreiben('----------------------------------------------------------------------------------------');
        if reg.ReadString('DHCPDomain') <> '' then
        begin
            result := true
        end else
        begin
            result := false;
        end;
      end;
    end;
  end;
  reg.Free;
end;
logfileschreiben ist eine Extra-Prozedur.

Aufruf:

Delphi-Quellcode:
if networkconnect=true then
   begin
      logfileschreiben('Networkcard: Network cable plugged in.');
      winipath:=vpnfile;     // Konfigurationsfile
      logfileschreiben('Using network version of VPN.ini: '+winipath);
   end else
   begin
      logfileschreiben('Networkcard: Network cable unplugged!');
      winipath:=getpath+'vpn.ini';
      logfileschreiben('Network not reachable, Using local VPN.ini file: '+winipath);
   end;

justify 14. Jun 2005 18:04

Huhu,

sorry, da hab' ich dann wohl was verwechselt - ist ja aber auch egal!

Es geht um eine kleine Unterkategorie, die nur testen soll, ob eine LAN-Verbindung hergestellt ist oder nicht und dementsprechend was ausgeben soll, also "verbunden" oder "nicht verbunden"!

Das alles soll bei einem Buttonklick passieren.

Könntest Du mir sagen, wie ich den Code abändern muß, damit es genau so geschieht?

toyoman 14. Jun 2005 18:16

Zitat:

Zitat von justify
Huhu,

sorry, da hab' ich dann wohl was verwechselt - ist ja aber auch egal!

Es geht um eine kleine Unterkategorie, die nur testen soll, ob eine LAN-Verbindung hergestellt ist oder nicht und dementsprechend was ausgeben soll, also "verbunden" oder "nicht verbunden"!

Das alles soll bei einem Buttonklick passieren.

Könntest Du mir sagen, wie ich den Code abändern muß, damit es genau so geschieht?

Du kannst die Prozedur von oben übernehmen und in deine Button.click Prozedur eintragen (zu oberst).
-Entferne alle Logfileschreiben Zeilen die brauchst du indem Fall nicht. Uses Registry nicht vergessen!

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:57 Uhr.
Seite 2 von 3     12 3      

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