【问题标题】:Enumerate list of network computers and shared folders in a tree view?在树视图中枚举网络计算机和共享文件夹的列表?
【发布时间】:2012-07-22 17:50:54
【问题描述】:

我知道有很多方法可以枚举网络上的计算机和设备,但是如何仅显示可用于 Windows 文件共享的计算机?我需要提供网络计算机及其共享文件夹的树视图。我知道我可以为此使用现有的 shell 控件,但我宁愿将其保留在我自己的树视图中。它只会列出网络上具有共享文件夹的计算机。通过计算机及其共享文件夹,我可以自己完成单个目录列表部分。我只需要知道如何获取计算机列表及其共享文件夹列表。

【问题讨论】:

    标签: delphi treeview delphi-xe2 file-sharing


    【解决方案1】:

    如果您对使用 WNetOpenEnum/WNetOpenEnum Windows API 的示例 Delphi 代码感兴趣,请考虑以下资源:

    熟练掌握NETRESOURCE structure也是必须的。

    我个人从http://www.developpez.net's Forum 推荐以下列表:

    清单 #1:


    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Unit2;
    
    type
      TForm1 = class(TForm)
        ListBox1: TListBox;
        procedure FormCreate(Sender: TObject);
      private
        procedure EnumNetworkProc(const aNetResource :TNetResource; const aLevel :word; var aContinue :boolean);
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    { TForm1 }
    
    procedure TForm1.EnumNetworkProc(const aNetResource :TNetResource; const aLevel :word; var aContinue :boolean);
    begin
      if aNetResource.dwDisplayType in [RESOURCEDISPLAYTYPE_DOMAIN, RESOURCEDISPLAYTYPE_SERVER] then
        ListBox1.Items.Add(StringOfChar(' ', aLevel*4) +aNetResource.lpRemoteName);
    end;
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      EnumNetwork(EnumNetworkProc, RESOURCE_GLOBALNET, RESOURCETYPE_DISK);
    end;
    
    end.
    

    清单 #2:

    unit Unit2;
    
    interface
    
    uses Windows;
    
    type
      TEnumNetworkProc = procedure(const aNetResource :TNetResource; const aLevel :word; var aContinue :boolean) of object;
    
    procedure EnumNetwork(const aEnumNetworkProc :TEnumNetworkProc; const aScope :dword = RESOURCE_GLOBALNET; const aType :dword = RESOURCETYPE_ANY);
    
    implementation
    
    //Procédure récursive
    procedure DoEnumNetwork(const aContainer :Pointer;
                            const aEnumNetworkProc :TEnumNetworkProc;
                            const aScope :dword;
                            const aType  :dword;
                            const aLevel :byte);
    type
      PNetResourceArray = ^TNetResourceArray;
      TNetResourceArray = array [0..0] of TNetResource;
    var
      NetHandle    :THandle;
      NetResources :PNetResourceArray;
      NetResult    :dword;
      Size, Count, i :Cardinal;
      Continue     :boolean;
    begin
      Continue := TRUE;
    
      NetResult := WNetOpenEnum(aScope, aType, 0, aContainer, NetHandle);
    
      if NetResult = NO_ERROR then
      try
        //Taille de base
        Size := 50 *SizeOf(TNetResource);
        GetMem(NetResources, Size);
    
        try
          while Continue do
          begin
            Count := $FFFFFFFF;
            NetResult := WNetEnumResource(NetHandle, Count, NetResources, Size);
    
            //Taille insuffisante ?
            if NetResult = ERROR_MORE_DATA
            then ReallocMem(NetResources, Size)
            else Break;
          end;
    
          //Enumère
          if NetResult = NO_ERROR then
            for i := 0 to Count - 1 do
            begin
              //Callback
              if Assigned(aEnumNetworkProc) then
              begin
                aEnumNetworkProc(NetResources^[i], aLevel, Continue);
                if not Continue then Break;
              end;
    
              //Appel récursif
              if (NetResources^[i].dwUsage and RESOURCEUSAGE_CONTAINER) > 0 then 
                DoEnumNetwork(@NetResources^[i], aEnumNetworkProc, aScope, aType, aLevel +1);
            end;
        finally
          FreeMem(NetResources, Size);
        end;
      finally
        WNetCloseEnum(NetHandle);
      end;
    end;
    
    procedure EnumNetwork(const aEnumNetworkProc: TEnumNetworkProc; const aScope, aType: dword);
    begin
      DoEnumNetwork(nil, aEnumNetworkProc, aScope, aType, 0);
    end;
    
    end.
    

    来源:Liste des machines sur un réseau local (tout le réseau de Win) - Lucas Panny 的原始帖子(法语)。

    【讨论】:

      【解决方案2】:

      WNetOpenEnum 会给你网络上的所有电脑

      WNetOpenEnum 函数启动网络资源的枚举 或现有的连接。您可以通过调用继续枚举 WNetEnumResource 函数。

      NetShareEnum你会在一台机器上共享。

      检索有关服务器上每个共享资源的信息。

      你可以结合使用两者来过滤掉你不想要的东西

      【讨论】:

      • Msdn NetSharesEnum 条目的附加摘录:You can also use the WNetEnumResource function to retrieve resource information. However, WNetEnumResource does not enumerate hidden shares or users connected to a share:如果枚举隐藏资源是 OP 要求的一部分 NetShareEnum 不是一个选项,是是吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多