![]() |
Programm um Computernamen aus Netzwerk auszulesen
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich habe mich in letzter Zeit mit Netzwerken befasst und habe jetzt zum Test mal ein kleines Programm geschrieben, was die Computernamen im Netzwerk ermittelt. Aber es funktioniert irgendwie nicht immer. :? Wäre nett,wenn es mal jemand testen könnte,der ein Netzwerk eingerichtet hat. Es funktioniert jetzt bei mir, aber bei anderen funktioniert es nicht, zumindest bei denen, die es schonmal getestet haben. Hier noch der Quelltext,den ich verwendet habe:
Delphi-Quellcode:
Wäre dankbar für Hilfe!
unit Unit1;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; ListBox1: TListBox; procedure Button1Click(Sender: TObject); private { Private-Deklarationen} public { Public-Deklarationen} end; PNetResourceArray = ^TNetResourceArray; TNetResourceArray = array[0..100] of TNetResource; var Form1: TForm1; implementation {$R *.DFM} function CreateNetResourceList(ResourceType: DWord; NetResource: PNetResource; out Entries: DWord; out List: PNetResourceArray): Boolean; var EnumHandle: THandle; BufSize: DWord; Res: DWord; begin Result := False; List := Nil; Entries := 0; if WNetOpenEnum(RESOURCE_GLOBALNET, ResourceType, 0, NetResource, EnumHandle) = NO_ERROR then begin try BufSize := $4000; // 16 kByte GetMem(List, BufSize); try repeat Entries := DWord(-1); FillChar(List^, BufSize, 0); Res := WNetEnumResource(EnumHandle, Entries, List, BufSize); if Res = ERROR_MORE_DATA then begin ReAllocMem(List, BufSize); end; until Res <> ERROR_MORE_DATA; Result := Res = NO_ERROR; if not Result then begin FreeMem(List); List := Nil; Entries := 0; end; except FreeMem(List); raise; end; finally WNetCloseEnum(EnumHandle); end; end; end; procedure ScanNetworkResources(ResourceType, DisplayType: DWord; List: TStrings); procedure ScanLevel(NetResource: PNetResource); var Entries: DWord; NetResourceList: PNetResourceArray; i: Integer; begin if CreateNetResourceList(ResourceType, NetResource, Entries, NetResourceList) then try for i := 0 to Integer(Entries) - 1 do begin if (DisplayType = RESOURCEDISPLAYTYPE_GENERIC) or (NetResourceList[i].dwDisplayType = DisplayType) then begin List.AddObject(NetResourceList[i].lpRemoteName, Pointer(NetResourceList[i].dwDisplayType)); end; if (NetResourceList[i].dwUsage and RESOURCEUSAGE_CONTAINER) <> 0 then ScanLevel(@NetResourceList[i]); end; finally FreeMem(NetResourceList); end; end; begin ScanLevel(Nil); end; procedure TForm1.Button1Click(Sender: TObject); begin ScanNetworkResources(RESOURCETYPE_DISK, RESOURCEDISPLAYTYPE_SERVER, ListBox1.Items); end; end. Gruß Paul |
Re: Programm um Computernamen aus Netzwerk auszulesen
Zitat:
|
Re: Programm um Computernamen aus Netzwerk auszulesen
Zitat:
Aber wenn er ein Netzwerk findet, dauert es auch nur ein paar Sekunden. Und wenn ich mein W-lan Adapter verbunden habe, findet er meinen eigenen Computer,wenn ich kein LAN verbunden habe. Aber wenn ich kein W-Lan verbunden habe und kein Lan,dann findet er auch nicht meinen eigenen Computer und es passiert nichts. Ich hoffe,ich habe es einigermaßen verständlich erklärt :gruebel: |
Re: Programm um Computernamen aus Netzwerk auszulesen
Hat schon jemand eine Iddee, woran es liegen könnte?
|
Re: Programm um Computernamen aus Netzwerk auszulesen
Ändere mal diesen Teil so ab :
Delphi-Quellcode:
Dann wirst Du sehen, dass sich doch etwas tut. Nur wenn ich das Programm starte, hat die Variable Entries schon einen Wert von 1942475233 (Breaktpoint bei if CreateNetResourceList... in der Procedure Scanlevel). Dann Ändert er den Wert auf 4. Trotzdem wird die Procedure mehr als 4 Mal durchgegangen.
procedure ScanNetworkResources(ResourceType, DisplayType: DWord; List: TStrings);
procedure ScanLevel(NetResource: PNetResource); var Entries: DWord; NetResourceList: PNetResourceArray; i: Integer; begin Application.ProcessMessage //<-- Änderung if CreateNetResourceList(ResourceType, NetResource, Entries, NetResourceList) then try for i := 0 to Integer(Entries) - 1 do begin if (DisplayType = RESOURCEDISPLAYTYPE_GENERIC) or (NetResourceList[i].dwDisplayType = DisplayType) then begin List.AddObject(NetResourceList[i].lpRemoteName, Pointer(NetResourceList[i].dwDisplayType)); end; if (NetResourceList[i].dwUsage and RESOURCEUSAGE_CONTAINER) <> 0 then ScanLevel(@NetResourceList[i]); end; finally FreeMem(NetResourceList); end; end; begin ScanLevel(Nil); end; |
Re: Programm um Computernamen aus Netzwerk auszulesen
Es funktioniert trotzdem nicht!
Was sollte sich denn da verändern? Mir ist nichts aufgefallen. Ich sehe nur,dass er das Application.ProzessMessages berücksichtigt. Denn der Button blieb vorher immer gedrückt, bis er fertig war und jetzt geht er gleich wieder hoch. (Sieht mal glaube ich nur im XP-Stil). |
Re: Programm um Computernamen aus Netzwerk auszulesen
Hallo,
der Fehler muss nicht zwingend im Programm liegen, wähle mal im Explorer einen Rechner aus, den es nicht (mehr) gibt, die Timeouts sind schon recht hoch und janachdem, wie groß ein Netzwerk ist, kann das schon mal alles eine Weile dauern. Für die 17 Rechner hier im Netz noch eingeschalteten braucht er so seine 30 Sekunden. Mach Dir mal noch 'ne Statusbar auf das Formular, setze SimplePanel auf true und füge in den Quelltext noch diese zwei Zeilen ein:
Delphi-Quellcode:
Dann solltest Du jeweils sehen können, wann ein neuer Rechner gefunden wurde und kannst ggfls. herausbekommen, bei welchem Rechner es "hakt".
List.AddObject(NetResourceList[i].lpRemoteName,
Pointer(NetResourceList[i].dwDisplayType)); Statusbar1.SimpleText := NetResourceList[i].lpRemoteName // <-- neu; Application.ProcessMessages; // <-- neu; Achso: Und wenn Du beim Klicken auf den Button zuerst die Liste leermachst, ist das eventuell auch nicht schlecht, sonst hat man irgendwann aller Rechner doppelt und dreifach :wink: in der Liste. Stephan |
Re: Programm um Computernamen aus Netzwerk auszulesen
Zitat:
Aber es kommt die Meldung: Undefinierter Bezeichner: StatusBar1. Muss ich da vielleicht eine bestimmte Unit hinzufügen? Paul |
Re: Programm um Computernamen aus Netzwerk auszulesen
Zitat:
|
Re: Programm um Computernamen aus Netzwerk auszulesen
Zitat:
Aber da das mit der StatusBar innerhalb der Funktion geschieht, heißt es nicht StatusBar1 sondern Form1.StatusBar1. Jetzt geht es. :| Aber trotzdem geschieht nichts! Ich habe kein lan verbunden. So, und wenn ich jetzt die netzwerke scanne, dann macht er ganz kurz was, aber die StatusBar bleibt leer. Und wenn ich mein W-Lan verbunden habe, dann bleibt die StatusBar auch leer und er hängt sich scheinbar auf, also ich kann nichts mehr anklicken. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz