Autor Beitrag
moelski
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 60

XP
D6 Prof.
BeitragVerfasst: Do 15.01.04 09:44 
Moins !

Ich habe im Netz folgenden Code gefunden, der mir alle Rechner mit seinen Freigaben auflistet:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
procedure GetNetworkedDrives( strings: TStrings);

  procedure EnumNetworkDrives( pnr : PNetResource);
  var
    hEnum: THandle;
    i, enumRes, count, BufferSize: DWORD;
    buffer: pointer;
  begin
    BufferSize := $4000//ie: use a 16kb buffer
    buffer := nil;  //just in case memory allocation fails
    if WNetOpenEnum(RESOURCE_GLOBALNET,
      RESOURCETYPE_DISK, 0, pnr, hEnum) = ERROR_SUCCESS then
    try
      GetMem(buffer, BufferSize);
      while true do
      begin
        count := dword(-1); //ie: get as many items possible
        enumRes := WNetEnumResource(hEnum,
          count, buffer, BufferSize);

        //break if either no more items found or an error occurs...
        if (enumRes <> ERROR_SUCCESS) then break;

        pnr := buffer; //reuse the pnr pointer
        for i := 1 to count do
        begin
          if (pnr.dwDisplayType =
               RESOURCEDISPLAYTYPE_DOMAIN or
               RESOURCEDISPLAYTYPE_SERVER) and
            (pnr.dwType = RESOURCETYPE_DISK) then
              strings.Add(pnr.lpRemoteName);
          //recursive function call...
          if (pnr.dwUsage and RESOURCEUSAGE_CONTAINER) > 0 then
            EnumNetworkDrives(pnr);
          inc(longint(pnr),sizeof(TNetResource));
        end;
      end;
    finally
      FreeMem(buffer);
      WNetCloseEnum(hEnum);
    end;
  end;

begin
  if strings = nil then exit;
  //simply call the nested recursive function
  //passing nil to starting at the network root ...
  EnumNetworkDrives(nil);
end;

Ich muss gestehen, das ich nicht ganz nachvollziehen kann, was da genau passiert. Deswegen auch meine Frage ... Kann ich den Code dahingehend abändern, sodas ich beim Aufruf der Prozedur
ausblenden Delphi-Quelltext
1:
GetNetworkedDrives(Memo1.lines);					

zusätzlich noch eine IP oder den Hostname Übergebe und dann auch nur für diesen Rechner die Freigaben angezeigt bekomme?

Wäre für einen Tip echt dankbar !

Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.

_________________
Grüße Moelski
Chatfix
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1583
Erhaltene Danke: 10

Win 10, Win 8, Win 7, Win Vista, Win XP
VB.net (VS 2015), MsSQL (T-SQL), HTML, CSS, PHP, MySQL
BeitragVerfasst: Fr 23.01.04 11:57 
Also mit dem PC-Name lässt sich ja einfach machen, da die Freigaben in der Regel mit dem HostName beginnen wenn ich mich nicht irre...

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
procedure GetNetworkedDrives(strings: TStrings; Host: String);

  procedure EnumNetworkDrives(pnr : PNetResource); 
  var 
    hEnum: THandle; 
    i, enumRes, count, BufferSize: DWORD; 
    buffer: pointer;
  begin

    BufferSize := $4000//ie: use a 16kb buffer
    buffer := nil;  //just in case memory allocation fails 
    if WNetOpenEnum(RESOURCE_GLOBALNET, 
      RESOURCETYPE_DISK, 0, pnr, hEnum) = ERROR_SUCCESS then 
    try 
      GetMem(buffer, BufferSize); 
      while true do 
      begin 
        count := dword(-1); //ie: get as many items possible 
        enumRes := WNetEnumResource(hEnum, 
          count, buffer, BufferSize); 

        //break if either no more items found or an error occurs... 
        if (enumRes <> ERROR_SUCCESS) then break; 

        pnr := buffer; //reuse the pnr pointer 
        for i := 1 to count do
        begin
          if (pnr.dwDisplayType = 
               RESOURCEDISPLAYTYPE_DOMAIN or 
               RESOURCEDISPLAYTYPE_SERVER) and
            (pnr.dwType = RESOURCETYPE_DISK) then
            begin
              if UpperCase(Copy(pnr.lpRemoteName, 0, Length(Host))) = UpperCase(Host) then
                strings.Add(pnr.lpRemoteName);
            end;
          //recursive function call... 
          if (pnr.dwUsage and RESOURCEUSAGE_CONTAINER) > 0 then
            EnumNetworkDrives(pnr);
          inc(longint(pnr),sizeof(TNetResource)); 
        end
      end;
    finally
      FreeMem(buffer); 
      WNetCloseEnum(hEnum); 
    end
  end

begin 
  if strings = nil then exit; 
  //simply call the nested recursive function 
  //passing nil to starting at the network root ...
  Host := '\\' + Host;
  EnumNetworkDrives(nil); 
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Button1.Enabled := False;
  Memo1.Clear;
  GetNetworkedDrives(Memo1.lines, Edit1.Text);
  Button1.Enabled := True;
end;

_________________
Gehirn: ein Organ, mit dem wir denken, daß wir denken. - Ambrose Bierce
Repli
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Do 16.08.07 11:17 
Erstmal ein herzliches Hallo von meiner Seite ;)
Hatte Delphi mal vor Jahren programmiert und dann aber auch nicht in dem Ausmaß wie es einige hier tun und bin mittlerweile ziemlich eingerostet, also nicht wundern ;)

Ich wollte mich heute auch mal mit dem Thema Netzwerkfreigaben & Co. in Delphi befassen und bin dann auf diesen Thread hier gestoßen der auf jeden Fall recht hilfreich ist. Allerdings ist mir in dem unten augeführten Code, meines Erachtens, noch ein Performance Problem enthalten wenn man die Eingabe des Hostnamen mit berücksichtigt.

Wenn ich das richtig verstanden habe scannt er ja trotzdem das komplette Netzwerk und listet aber dann nur die Freigabe auf, in der der eingegeben Hostname enthalten ist. Wäre es da nicht sinnvoller schon die Suche bzw. das Scannen auf den eingegeben Hostnamen einzuschränken ?

Ich will z.B. nur meine eigenen Freigaben zu sehen bekommen. Dafür scannt er allerdings einige Minuten da das Netzwerk u.U. 100 Rechner befasst.

Schonmal vielen Dank im Vorraus.

Greetz
Repli
Repli
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Do 30.08.07 15:42 
Niemand eine Idee ?