Delphi-PRAXiS
Seite 4 von 11   « Erste     234 56     Letzte »    

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)

MrKnogge 9. Jun 2004 18:51

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
wenn mein Rechner nicht mit dem Switch verbunden ist, so bekomm ich als IP immer die localhost-adresse. Sobald eine Verbindung besteht hat er die IP, wie ich sie festgelegt habe (192.168.10.1)

Kasoft 9. Jun 2004 19:22

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
Hat jetzt mein Code wirklich bei keinem Funktioniert?

Ratte 9. Jun 2004 19:51

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
Wenn du eine schreibgeschützte Datei auf ein Netzlaufwerk packts, auf das alle clients Zugriff haben, müsste doch fileexists gehen, oder?

Ratte

novabeat 9. Jun 2004 22:03

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
also ich hab mal bei mir in die registry geschaut. da existieren die werte, die du da abfrgats nicht mal

djmasi 8. Jul 2004 08:46

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
Hatte mich auch schon mit dem Thema rumgeärgert. Die Sachen mit Registry und MAC Adresse fallen raus, da das mit der Reg auf jedem Windows unterschiedlich ist und die MAC bei Entfernen des Kabels erhalten bleibt.

Habe aber gerade etwas gefunden bei delphi3000.com.

bin mal so frei und liste den verwendeten Code:

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button2: TButton;
    Timer1: TTimer;
    CheckBox1: TCheckBox;
    procedure Button2Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    function DetectHostIP: boolean;
  end;

var
  Form1: TForm1;
  HostIP:String='Unknown';


implementation

{$R *.dfm}

function TForm1.DetectHostIP: Boolean;
var
  wsdata: TWSAData;
  hostname: array[0..255] of char;
  hostEnt: PHostEnt;
  addr: PChar;
begin
  WSAStartup($0101,wsdata);
  try
    gethostname(hostname,sizeof(hostname));
    hostEnt := gethostbyname(hostname);
    if Assigned(hostEnt) then
      if Assigned(hostEnt^.h_addr_list) then
        begin
          addr := hostEnt^.h_addr_list^;
          if Assigned(addr) then
            begin
              HostIP := Format('%d.%d.%d.%d',[byte(addr[0]),byte(addr[1]),byte(addr[2]),byte(addr[3])]);
              Result := True;
            end
          else
            Result := False;
        end
      else
        Result := False
    else
      begin
        MessageDlg(Format('WinSock Error %d', [WSAGetLastError]),mtError,[mbOK],0);
        Result := False;
      end;
  finally
    WSACleanup;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  if DetectHostIP=True then ShowMessage(HostIP);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if DetectHostIP=True then
    if HostIP <> '127.0.0.1' then
      CheckBox1.Checked := True //CheckBox sagt: Netzwerkkabel steckt
    else
      CheckBox1.Checked := False; //oder halt net
end;

end.
Bei mir funktioniert das wunderbar, nach dem Rausziehen dauert es circa 5 sek, beim Reinstecken 1/2 sek bis es umschlägt.

Das Problem ist allerdings: Bei meinem Centrino 1.5 braucht das Prog 20% CPU. Das darf natürlich nicht sein. Habe aber grad keine Lust da ich morgen ne Algebra Klausur schreibe.

Aber werde mich damit weiter befassen.

Ciao Thomas

w3seek 8. Jul 2004 09:18

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
Evtl. ist das hier was du suchst: MSDN-Library durchsuchenRasConnectionNotification und evtl (wenn auch unwahrscheinlicher MSDN-Library durchsuchenRasAdminConnectionHangupNotification

djmasi 8. Jul 2004 16:36

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
Leider nein :?

Mir geht es ja um die lokale IP und keine Interneteinwahl.

Aber nochmal zur Überlegung. Was soll angezeigt werden?
  • Alle Netzwerkverbindungen
  • Deren jeweiliger Status (z.B. LAN verfügbar, Adresse xyz, WLAN nicht verfügbar, 1394 nicht verfügbar/deaktiviert,...)

djmasi 10. Jul 2004 22:58

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
Liste der Anhänge anzeigen (Anzahl: 1)
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:

novabeat 11. Jul 2004 08:10

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
also ich habs mal getestet ! bei mir unter WinXP home gehts einwandfrei allerdings unter WinME gehts gar nicht.

djmasi 11. Jul 2004 09:53

Re: Feststellen, ob Netzwerkkabel gezogen wurde?
 
Hmm, hab gerade gesehen dass es NetConnectionID erst ab XP gibt. Da ich kein Win98/ME mehr habe, wäre es schön wenn vielleicht jemand für diese Windows-Versionen was findet.
Die Funktionen von Win32_NetworkAdapter findet ihr hier

[edit]
@novabeat:
kannst du mir bitte eine genaue Fehlerbeschreibung geben. An welcher Zeiler hängt es unter ME, etc?

Danke


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:24 Uhr.
Seite 4 von 11   « Erste     234 56     Letzte »    

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