Delphi-Help

Главная Статьи Сеть Как узнать все доступные сетевые pесуpсы?

Как узнать все доступные сетевые pесуpсы?

Оцените материал
(0 голосов)


Как узнать все доступные сетевые pесуpсы?

uses
  ..., ComCtrls;
 
type
  PNetResourceArray = ^TNetResourceArray;
  TNetResourceArray = array[0..MaxInt div SizeOf( TNetResource )-1] of TNetResource;
 
procedure EnumResources(LpNR: PNetResource);
var
  NetHandle: THandle;
  BufSize: integer;
  Size: integer;
  NetResources: PNetResourceArray;
  Count: Integer;
  NetResult: integer;
  i: integer;
  NewItem: TListItem;
begin
   if WNetOpenEnum( RESOURCE_GLOBALNET,
                    RESOURCETYPE_ANY,
                    // RESOURCETYPE_ANY - все ресурсы
                    // RESOURCETYPE_DISK - диски
                    // RESOURCETYPE_PRINT - принтеры
                    0, LpNR, NetHandle) <> NO_ERROR then Exit;
   try
      BufSize := 50 * SizeOf( TNetResource );
      GetMem( NetResources, BufSize );
      try
         while true do
         begin
            Count := -1;
            Size := BufSize;
            NetResult := WNetEnumResource( NetHandle, Cardinal( Count ), NetResources, Cardinal( Size ) );
            if NetResult = ERROR_MORE_DATA then
            begin
               BufSize := Size;
               ReallocMem( NetResources, BufSize );
               Continue;
            end;
            if NetResult <> NO_ERROR then Exit;
            for i := 0 to Count-1 do
            begin
               with NetResources^[I] do
               begin
                  if RESOURCEUSAGE_CONTAINER = ( DwUsage and RESOURCEUSAGE_CONTAINER ) then
                     EnumResources(@NetResources^[I]);
                  if dwDisplayType = RESOURCEDISPLAYTYPE_SHARE then
                  // ^^^^^^^^^^^^^^^^^^^^^^^^^^ - ресурс
                  // RESOURCEDISPLAYTYPE_SERVER - компьютер
                  // RESOURCEDISPLAYTYPE_DOMAIN - рабочая группа
                  // RESOURCEDISPLAYTYPE_GENERIC - сеть
                  begin
                     NewItem := Form1.ListView1.Items.Add;
                     NewItem.Caption := LpRemoteName;
                  end;
               end;
            end;
         end;
      finally
         FreeMem( NetResources, BufSize );
      end;
   finally
      WNetCloseEnum( NetHandle );
   end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  OldCursor: TCursor;
begin
   OldCursor := Screen.Cursor;
   Screen.Cursor := crHourGlass;
   with ListView1.Items do
   begin
      BeginUpdate;
      Clear;
      EnumResources( nil );
      EndUpdate;
   end;
   Screen.Cursor := OldCursor;
end
Прочитано 3950 раз

Авторизация



Счетчики