AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Programm um Computernamen aus Netzwerk auszulesen
Thema durchsuchen
Ansicht
Themen-Optionen

Programm um Computernamen aus Netzwerk auszulesen

Ein Thema von Paul0703 · begonnen am 24. Sep 2008 · letzter Beitrag vom 28. Sep 2008
Antwort Antwort
Seite 1 von 2  1 2      
Paul0703

Registriert seit: 24. Sep 2008
Ort: Halle(Saale)
138 Beiträge
 
Delphi 7 Professional
 
#1

Programm um Computernamen aus Netzwerk auszulesen

  Alt 24. Sep 2008, 18:00
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
Angehängte Dateien
Dateityp: exe netzwerk_139.exe (290,0 KB, 24x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Programm um Computernamen aus Netzwerk auszulesen

  Alt 24. Sep 2008, 18:19
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?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Paul0703

Registriert seit: 24. Sep 2008
Ort: Halle(Saale)
138 Beiträge
 
Delphi 7 Professional
 
#3

Re: Programm um Computernamen aus Netzwerk auszulesen

  Alt 24. Sep 2008, 18:37
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
  Mit Zitat antworten Zitat
Paul0703

Registriert seit: 24. Sep 2008
Ort: Halle(Saale)
138 Beiträge
 
Delphi 7 Professional
 
#4

Re: Programm um Computernamen aus Netzwerk auszulesen

  Alt 25. Sep 2008, 19:04
Hat schon jemand eine Iddee, woran es liegen könnte?
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#5

Re: Programm um Computernamen aus Netzwerk auszulesen

  Alt 25. Sep 2008, 19:44
Ä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.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Paul0703

Registriert seit: 24. Sep 2008
Ort: Halle(Saale)
138 Beiträge
 
Delphi 7 Professional
 
#6

Re: Programm um Computernamen aus Netzwerk auszulesen

  Alt 26. Sep 2008, 16:16
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).
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#7

Re: Programm um Computernamen aus Netzwerk auszulesen

  Alt 26. Sep 2008, 17:04
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 in der Liste.

Stephan
  Mit Zitat antworten Zitat
Paul0703

Registriert seit: 24. Sep 2008
Ort: Halle(Saale)
138 Beiträge
 
Delphi 7 Professional
 
#8

Re: Programm um Computernamen aus Netzwerk auszulesen

  Alt 27. Sep 2008, 12:34
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 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
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#9

Re: Programm um Computernamen aus Netzwerk auszulesen

  Alt 28. Sep 2008, 01:30
Zitat von Paul0703:
Aber es kommt die Meldung: Undefinierter Bezeichner: StatusBar1.
Du solltest eine TStatusBar (Unit ComCtrls) in Dein Formular einfügen.
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
Paul0703

Registriert seit: 24. Sep 2008
Ort: Halle(Saale)
138 Beiträge
 
Delphi 7 Professional
 
#10

Re: Programm um Computernamen aus Netzwerk auszulesen

  Alt 28. Sep 2008, 10:51
Zitat von Garfield:
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:35 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