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! |
Zitat:
|
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? |
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. |
Zitat:
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 |
Gut zu wissen.
Aber selbst da ist ein Fehler, denn mein Stecker ist drinne und trotzdem zeigt er an, daß er nicht eingesteckt ist. |
Zitat:
Wieviele Netzwerkadapter und welche sind aktiviert? |
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Hallo zusammen :)
eine kleine Abwandlung des Codes von toyoman ..
Code:
sollte auf allen XP laufen :)
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; |
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? |
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 |
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:
|
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
hast du denn ein Form1 und einen Button1 auf dem Form drauf?
|
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Lösch mal Zeile 11 und 26.
|
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. |
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 |
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. |
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:
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.
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; |
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Binde mal die Units "ComObj" und "ActiveX" ein
|
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Danke spaxxn das wars. Jetzt hängt es allerdings beim Aufrufen der procedure
Zitat:
Edit: Ok habe es dann doch selbst entdeckt :) hatte statt procedure xxx.yyyy nur procedure yyyy stehen gehabt. |
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Edit: Ich schlaf noch
|
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. |
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Zitat:
|
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Zitat:
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. |
Re: Feststellen, ob Netzwerkkabel gezogen wurde?
Du instanziierst mit
Delphi-Quellcode:
innerhalb eines Timer ein Objekt; logisch, dass irgendwann der Speicher vollläuft, wenn Du das Objekt nicht wieder zerstörst!
WMI:=CreateOleObject('WbemScripting.SWbemLocator');
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. |
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. |
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?
|
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; |
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. |
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