📄 fmmain.pas
字号:
unit fmMain;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ComCtrls, ImgList;
type
TMainForm = class(TForm)
TV: TTreeView;
ImageList1: TImageList;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
MainForm: TMainForm;
implementation
{$R *.DFM}
const InitialSize = $1; // Any positive value is acceptable.
type
TNetEnumThread = class(TThread)
ChildNode: String;
TreeNode: TTreeNode;
imgIndex,selIndex:integer;
procedure AddChildNode;
procedure Execute; override;
procedure LoadNetNode(NetNode: PNetResourceA);
end;
procedure TNetEnumThread.Execute;
begin
TreeNode:=nil;
LoadNetNode(nil);
end;
procedure TNetEnumThread.AddChildNode();
begin
TreeNode:=MainForm.TV.Items.AddChild(TreeNode,ChildNode);
treenode.ImageIndex:=imgIndex;
treenode.SelectedIndex:=selIndex;
end;
procedure TNetEnumThread.LoadNetNode(NetNode: PNetResourceA);
var hEnum : THandle;
Count,BufSize, Usage: DWORD;
NR,Buf: PNetResourceA;
R: Integer;
CurrentNode: TTreeNode;
begin
R:=WNetOpenEnum(RESOURCE_GLOBALNET,RESOURCETYPE_ANY,0
{RESOURCEUSAGE_CONTAINER},NetNode,hEnum);
if R <> NO_ERROR then exit;
BufSize:=InitialSize; GetMem(Buf,BufSize);
try
while True do
begin
Count:=$FFFFFFFF; //读取所有的网络组
R:=WNetEnumResource(hEnum,Count, Buf, BufSize);
if R = ERROR_MORE_DATA then //分配的内存不够
begin
Count:=$FFFFFFFF; //读取所有的资源
FreeMem(Buf); GetMem(Buf,BufSize);
R:=WNetEnumResource(hEnum,Count, Buf, BufSize);
end;
//该节点下所有的网络资源已经取得
if R = ERROR_NO_MORE_ITEMS then Break;
if R <> NO_ERROR then Abort; //出错
NR:=Buf;
while Count > 0 do
begin
CurrentNode:=TreeNode; //取得当前节点
if NR.lpRemoteName <> nil then
ChildNode:=StrPas(NR.lpRemoteName)
else
ChildNode:='';
// 获取每个资源节点的信息
ChildNode:=ChildNode+' 【DisplayType=';
case NR.dwDisplayType of
RESOURCEDISPLAYTYPE_GENERIC:
ChildNode:=ChildNode+'Generic';
RESOURCEDISPLAYTYPE_DOMAIN:
ChildNode:=ChildNode+'Domain';
RESOURCEDISPLAYTYPE_SERVER:
ChildNode:=ChildNode+'Server';
RESOURCEDISPLAYTYPE_SHARE:
ChildNode:=ChildNode+'Share';
RESOURCEDISPLAYTYPE_FILE:
ChildNode:=ChildNode+'File';
RESOURCEDISPLAYTYPE_GROUP:
ChildNode:=ChildNode+'Group';
RESOURCEDISPLAYTYPE_NETWORK:
ChildNode:=ChildNode+'Network';
RESOURCEDISPLAYTYPE_ROOT:
ChildNode:=ChildNode+'Root';
RESOURCEDISPLAYTYPE_SHAREADMIN:
ChildNode:=ChildNode+'ShareAdmin';
RESOURCEDISPLAYTYPE_DIRECTORY:
ChildNode:=ChildNode+'Directory';
RESOURCEDISPLAYTYPE_TREE:
ChildNode:=ChildNode+'Tree';
RESOURCEDISPLAYTYPE_NDSCONTAINER:
ChildNode:=ChildNode+'NDS Container';
else
ChildNode:=ChildNode+'? ('+IntToStr(NR.dwDisplayType)+')';
end;
imgIndex:=NR.dwDisplayType;
selIndex:=NR.dwDisplayType;
if NR.dwScope = RESOURCE_GLOBALNET then
begin
ChildNode:=ChildNode+' Usage=';
Usage:=NR.dwUsage;//资源用途
if (Usage and RESOURCEUSAGE_CONNECTABLE) <> 0 then
ChildNode:=ChildNode+'Connectable;';
Usage:=Usage and not RESOURCEUSAGE_CONNECTABLE;
if (Usage and RESOURCEUSAGE_CONTAINER) <> 0 then
ChildNode:=ChildNode+'Container;';
Usage:=Usage and not RESOURCEUSAGE_CONTAINER;
if (Usage and RESOURCEUSAGE_NOLOCALDEVICE) <> 0 then
ChildNode:=ChildNode+'NoLocalDevice';
Usage:=Usage and not RESOURCEUSAGE_NOLOCALDEVICE;
if (Usage and RESOURCEUSAGE_SIBLING) <> 0 then
ChildNode:=ChildNode+'Sibling';
Usage:=Usage and not RESOURCEUSAGE_SIBLING;
if (Usage and RESOURCEUSAGE_ATTACHED) <> 0 then
ChildNode:=ChildNode+'Attached';
Usage:=Usage and not RESOURCEUSAGE_ATTACHED;
if (Usage and RESOURCEUSAGE_RESERVED) <> 0 then
ChildNode:=ChildNode+'Reserved';
Usage:=Usage and not RESOURCEUSAGE_RESERVED;
if Usage <> 0 then
ChildNode:=ChildNode+'? ('+IntToHex(Usage,8)+')';
end;
//资源类型
ChildNode:=ChildNode+' Type=';
case NR.dwType of
RESOURCETYPE_ANY: ChildNode:=ChildNode+'Any';
RESOURCETYPE_DISK: ChildNode:=ChildNode+'Disk';
RESOURCETYPE_PRINT: ChildNode:=ChildNode+'Print';
else
ChildNode:=ChildNode+'?';
end;
//资源范围
ChildNode:=ChildNode+' Scope=';
case NR.dwScope of
RESOURCE_CONNECTED: ChildNode:=ChildNode+'Connected';
RESOURCE_GLOBALNET: ChildNode:=ChildNode+'Globalnet';
RESOURCE_REMEMBERED: ChildNode:=ChildNode+'Remembered';
else
ChildNode:=ChildNode+'?';
end;
ChildNode:=ChildNode+'】';
//加入资源节点
Synchronize(AddChildNode);
//加入子节点
LoadNetNode(NR);
TreeNode:=CurrentNode;
INC(NR);
DEC(Count);
end;
end;
finally
WNetCloseEnum(hEnum); //关闭枚举网络句柄
FreeMem(Buf); //释放内存
end;
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
TNetEnumThread.Create(False);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -