unit netres_main_unit;interfaceuses
  Windows, Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs,
  ComCtrls, StdCtrls, Buttons, Menus, ExtCtrls;
type  TfrmMain = class(TForm)
    tvResources: TTreeView;
    btnOK: TBitBtn;
    btnClose: TBitBtn;
    Label1: TLabel;
    barBottom: TStatusBar;
    popResources: TPopupMenu;
    mniExpandAll: TMenuItem;
    mniCollapseAll: TMenuItem;
    mniSaveToFile: TMenuItem;
    mniLoadFromFile: TMenuItem;
    grpListType: TRadioGroup;
    grpResourceType: TRadioGroup;
    dlgOpen: TOpenDialog;
    dlgSave: TSaveDialog;
    procedure FormCreate(Sender: TObject);
    procedure btnCloseClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure mniExpandAllClick(Sender: TObject);
    procedure mniCollapseAllClick(Sender: TObject);
    procedure mniSaveToFileClick(Sender: TObject);
    procedure mniLoadFromFileClick(Sender: TObject);
    procedure btnOKClick(Sender: TObject);
  private
    ListType, ResourceType: DWORD;
    procedure ShowHint(Sender: TObject);
    procedure DoEnumeration;
    procedure DoEnumerationContainer(NetResContainer: TNetResource);
    procedure AddContainer(NetRes: TNetResource);
    procedure AddShare(TopContainerIndex: Integer; NetRes:TNetResource);
    procedure AddShareString(TopContainerIndex: Integer; ItemName:String);
    procedure AddConnection(NetRes: TNetResource);
  public
    { Public declarations }
end;
var
  frmMain: TfrmMain;implementation
{$R *.DFM}
procedure TfrmMain.ShowHint(Sender: TObject);
begin
  barBottom.Panels.Items[0].Text:=Application.Hint;
end;
procedure TfrmMain.FormCreate(Sender: TObject);
begin
  Application.OnHint:=ShowHint;
  barBottom.Panels.Items[0].Text:='';
end;
procedure TfrmMain.btnCloseClick(Sender: TObject);
begin
  Close;
end;
{  Enumerate through all network resources:}
procedure TfrmMain.DoEnumeration;
var
  NetRes: Array[0..2] of TNetResource;
  Loop: Integer;
  r, hEnum, EntryCount, NetResLen: DWORD;
begin
  case grpListType.ItemIndex of
    { Connected resources: }
    1: ListType:=RESOURCE_CONNECTED;
    { Persistent resources: }
    2: ListType:=RESOURCE_REMEMBERED;
    { Global: }
    else ListType:=RESOURCE_GLOBALNET;
  end;
  case grpResourceType.ItemIndex of    { Disk resources: }
    1: ResourceType:=RESOURCETYPE_DISK;    { Print resources: }
    2: ResourceType:=RESOURCETYPE_PRINT;    { All: }
    else
 ResourceType:=RESOURCETYPE_ANY;
  end;
  Screen.Cursor:=crHourGlass;
  try    { Delete any old items in the tree view: }
    for Loop:=tvResources.Items.Count-1 downto 0 do
      tvResources.Items[Loop].Delete;
  except
  end;  { Start enumeration: }
  r:=WNetOpenEnum(ListType,ResourceType,0,nil,hEnum);
  if r<>NO_ERROR then
  begin
    if r=ERROR_EXTENDED_ERROR then
      MessageDlg('Unable to Enumerate the Network.'+#13+
        'A network-specific error occurred.',mtError,[mbOK],0)
    else
      MessageDlg('Unable to Enumerate the Network.',mtError,[mbOK],0);
    Exit;
  end;
  try
    { We got a valid enumeration handle; walk the resources: }
    while (1=1) do
    begin
      EntryCount:=1;
      NetResLen:=SizeOf(NetRes);
      r:=WNetEnumResource(hEnum,EntryCount,@NetRes,NetResLen);
      case r of
        0: begin          { It's a container, iterate it: }
          if NetRes[0].dwUsage=RESOURCEUSAGE_CONTAINER then
            DoEnumerationContainer(NetRes[0])
          else
            { Persistent and connected resources show up here: }
            if ListType in [RESOURCE_REMEMBERED,RESOURCE_CONNECTED] then
              AddConnection(NetRes[0]);
        end;        { Done: }
        ERROR_NO_MORE_ITEMS: Break;        { Other error: }
        else
        begin
          MessageDlg('Error Walking Resources.',mtError,[mbOK],0);
          Break;
        end;
      end;
    end;
  finally
    Screen.Cursor:=crDefault;
    { Close enumeration handle: }
    WNetCloseEnum(hEnum);
  end;
end;
{  Enumerate through the specified container:
  This function is usually recursively called.}
procedure TfrmMain.DoEnumerationContainer(NetResContainer:TNetResource);
var
  NetRes: Array[0..10] of TNetResource;
  TopContainerIndex: Integer;
  r, hEnum, EntryCount, NetResLen: DWORD;
begin
  { Add container name to tree view: }  AddContainer(NetResContainer);
  { Keep track of this item as current root: }
  TopContainerIndex:=tvResources.Items.Count-1;
  { Start enumeration: }
  if ListType=RESOURCE_GLOBALNET then    { Enumerating global net: }
    r:=WNetOpenEnum(ListType,ResourceType,RESOURCEUSAGE_CONTAINER,
      @NetResContainer,hEnum)
  else
    { Enumerating connections or persistent (won't normally get here):}
    r:=WNetOpenEnum(ListType,ResourceType,RESOURCEUSAGE_CONTAINER,
      nil,hEnum);
  { Couldn't enumerate through this container; just make a note
    of it and continue on: }
  if r<>NO_ERROR then
  begin
    AddShareString(TopContainerIndex,'<Couldn''t Enumerate Resources(Error #'+
      IntToStr(r)+'>');
    WNetCloseEnum(hEnum);
    Exit;
  end;
  { We got a valid enumeration handle; walk the resources: }
  while (1=1) do
  begin
    EntryCount:=1;
    NetResLen:=SizeOf(NetRes);
    r:=WNetEnumResource(hEnum,EntryCount,@NetRes,NetResLen);
    case r of
      0: begin
        { Yet another container to enumerate; call this function
          recursively to handle it: }
        if (NetRes[0].dwUsage=RESOURCEUSAGE_CONTAINER) or
          (NetRes[0].dwUsage=10) then                        DoEnumerationContainer(NetRes[0])
        else
          case NetRes[0].dwDisplayType of
            { Top level type: }                        RESOURCEDISPLAYTYPE_GENERIC,
            RESOURCEDISPLAYTYPE_DOMAIN,
            RESOURCEDISPLAYTYPE_SERVER: AddContainer(NetRes[0]);
            { Share: }
            RESOURCEDISPLAYTYPE_SHARE:
AddShare(TopContainerIndex,NetRes[0]);
          end;
        end;
      ERROR_NO_MORE_ITEMS: Break;
      else
      begin
        MessageDlg('Error #'+IntToStr(r)+' WalkingResources.',mtError,[mbOK],0);
        Break;
      end;
    end;
  end;
  { Close enumeration handle: }
  WNetCloseEnum(hEnum);
end;
procedure TfrmMain.FormShow(Sender: TObject);
begin
  DoEnumeration;
end;
{Add item to tree view; indicate that it is a container:}
procedure TfrmMain.AddContainer(NetRes: TNetResource);
var
  ItemName: String;
begin
  ItemName:=Trim(String(NetRes.lpRemoteName));
  if Trim(String(NetRes.lpComment))<>'' then  begin
    if ItemName<>'' then
      ItemName:=ItemName+'  ';
    ItemName:=ItemName+'('+String(NetRes.lpComment)+')';
  end;
  tvResources.Items.Add(tvResources.Selected,ItemName);
end;
{  Add child item to container denoted as current top:}
procedure TfrmMain.AddShare(TopContainerIndex: Integer; NetRes:TNetResource);
var
  ItemName: String;
begin
  ItemName:=Trim(String(NetRes.lpRemoteName));
  if Trim(String(NetRes.lpComment))<>'' then
  begin
    if ItemName<>'' then ItemName:=ItemName+'  ';
    ItemName:=ItemName+'('+String(NetRes.lpComment)+')';
  end;
  tvResources.Items.AddChild(tvResources.Items[TopContainerIndex],ItemName);
end;
{Add child item to container denoted as current top;
  this just adds a string for purposes such as being unable
  to enumerate a container.  That is, the container's shares
  are not accessible to us.}
procedure TfrmMain.AddShareString(TopContainerIndex: Integer;ItemName: String);
begin
  tvResources.Items.AddChild(tvResources.Items[TopContainerIndex],ItemName);
end;
{  Add a connection to the tree view.
  Mostly used for persistent and currently connected  resources to be displayed.}
procedure TfrmMain.AddConnection(NetRes: TNetResource);
var
  ItemName: String;
begin
  ItemName:=Trim(String(NetRes.lpLocalName));
  if Trim(String(NetRes.lpRemoteName))<>'' then
  begin
    if ItemName<>'' then ItemName:=ItemName+'  ';
    ItemName:=ItemName+'-> '+Trim(String(NetRes.lpRemoteName));
  end;
  tvResources.Items.Add(tvResources.Selected,ItemName);
end;
{  Expand all containers in the tree view:}
procedure TfrmMain.mniExpandAllClick(Sender: TObject);
begin
  tvResources.FullExpand;end;
{  Collapse all containers in the tree view:}
procedure TfrmMain.mniCollapseAllClick(Sender: TObject);
begin
  tvResources.FullCollapse;
end;
{  Allow saving of tree view to a file:}
procedure TfrmMain.mniSaveToFileClick(Sender: TObject);
begin
  if dlgSave.Execute then           tvResources.SaveToFile(dlgSave.FileName);
end;
{Allow loading of tree view from a file:}
procedure TfrmMain.mniLoadFromFileClick(Sender: TObject);
begin
  if dlgOpen.Execute then            tvResources.LoadFromFile(dlgOpen.FileName);end;
    {Rebrowse:}
procedure TfrmMain.btnOKClick(Sender: TObject);
begin
  DoEnumeration;
end;end.