gpt4 book ai didi

delphi - 在 TreeView 中枚举网络计算机和共享文件夹的列表?

转载 作者:行者123 更新时间:2023-12-02 20:02:47 27 4
gpt4 key购买 nike

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

最佳答案

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

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

我个人推荐 http://www.developpez.net 中的以下列表的论坛:

list #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.
<小时/>

list #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 的原始帖子(法语)。

关于delphi - 在 TreeView 中枚举网络计算机和共享文件夹的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11602599/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com