Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Programm um Computernamen aus Netzwerk auszulesen (https://www.delphipraxis.net/121255-programm-um-computernamen-aus-netzwerk-auszulesen.html)

Paul0703 24. Sep 2008 17:00


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:
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.
Wäre dankbar für Hilfe!

Gruß Paul

SirThornberry 24. Sep 2008 17:19

Re: Programm um Computernamen aus Netzwerk auszulesen
 
Zitat:

... aber bei anderen funktioniert es nicht...
Wie äußert sich das? gibt es eine Fehlermeldung oder einen Fehlercode? Funktioniert es denn mit Windows Boardmitteln oder auch da nicht?

Paul0703 24. Sep 2008 17:37

Re: Programm um Computernamen aus Netzwerk auszulesen
 
Zitat:

Zitat von SirThornberry
Zitat:

... aber bei anderen funktioniert es nicht...
Wie äußert sich das? gibt es eine Fehlermeldung oder einen Fehlercode? Funktioniert es denn mit Windows Boardmitteln oder auch da nicht?

Naja,wenn er keine Netzwerke findet, hängt er für mehrere Minuten und wenn ich was klicke, hängt sich das Programm ganz auf.
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:

Paul0703 25. Sep 2008 18:04

Re: Programm um Computernamen aus Netzwerk auszulesen
 
Hat schon jemand eine Iddee, woran es liegen könnte?

RWarnecke 25. Sep 2008 18:44

Re: Programm um Computernamen aus Netzwerk auszulesen
 
Ändere mal diesen Teil so ab :
Delphi-Quellcode:
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;
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.

Paul0703 26. Sep 2008 15:16

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).

nahpets 26. Sep 2008 16:04

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:
List.AddObject(NetResourceList[i].lpRemoteName,
Pointer(NetResourceList[i].dwDisplayType));
Statusbar1.SimpleText := NetResourceList[i].lpRemoteName // <-- neu;
Application.ProcessMessages; // <-- neu;
Dann solltest Du jeweils sehen können, wann ein neuer Rechner gefunden wurde und kannst ggfls. herausbekommen, bei welchem Rechner es "hakt".

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

Paul0703 27. Sep 2008 11:34

Re: Programm um Computernamen aus Netzwerk auszulesen
 
Zitat:

Zitat von nahpets
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:
List.AddObject(NetResourceList[i].lpRemoteName,
Pointer(NetResourceList[i].dwDisplayType));
Statusbar1.SimpleText := NetResourceList[i].lpRemoteName // <-- neu;
Application.ProcessMessages; // &lt;-- neu;
Dann solltest Du jeweils sehen können, wann ein neuer Rechner gefunden wurde und kannst ggfls. herausbekommen, bei welchem Rechner es "hakt".

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

Danke für deine Hilfe!
Aber es kommt die Meldung: Undefinierter Bezeichner: StatusBar1.
Muss ich da vielleicht eine bestimmte Unit hinzufügen?

Paul

Garfield 28. Sep 2008 00:30

Re: Programm um Computernamen aus Netzwerk auszulesen
 
Zitat:

Zitat von Paul0703
Aber es kommt die Meldung: Undefinierter Bezeichner: StatusBar1.

Du solltest eine TStatusBar (Unit ComCtrls) in Dein Formular einfügen.

Paul0703 28. Sep 2008 09:51

Re: Programm um Computernamen aus Netzwerk auszulesen
 
Zitat:

Zitat von Garfield
Zitat:

Zitat von Paul0703
Aber es kommt die Meldung: Undefinierter Bezeichner: StatusBar1.

Du solltest eine TStatusBar (Unit ComCtrls) in Dein Formular einfügen.

Das habe ich gemacht.
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 12:28 Uhr.
Seite 1 von 2  1 2      

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