刚好,我写了一段代码,希望对你有所帮助,大致如下(如有问题,请Mail给我。上次对不起,我不是有意的):
//将其加入到一个TTreeView(tvUser)对象:
function TfrmChat.AddTolvUser(const ANode: TTreeNode; const lpns: PNetResource): TTreeNode;
var Node: TTreeNode;
pCaption: String;
begin
pCaption := KillChars(lpns.lpRemoteName, ['\'], True);
Node := tvUser.Items.AddChild(ANode, pCaption);
case lpns.dwDisplayType of
RESOURCEDISPLAYTYPE_NETWORK: //整个网络
Node.ImageIndex := NetWork;
RESOURCEDISPLAYTYPE_DOMAIN: //一个域
Node.ImageIndex := DoMain;
RESOURCEDISPLAYTYPE_SERVER: //一台PC机
Node.ImageIndex := PC;
else //不会发生,避免编译警告
Node.ImageIndex := PC;
end;
Node.SelectedIndex := Node.ImageIndex;
Node.StateIndex := CheckNone;
Result := Node;
end;
//第一次ANode可以为nil,如EnumPCsInNetWork(ANode, nil);或者EnumPCsInNetWork(nil);
function TfrmChat.EnumPCsInNetWork(const ANode: TTreeNode; const lpnr: PNetResource = nil): Boolean;
var hEnum: THANDLE;
Node: TTreeNode;
cbBuffer, nLoop: DWORD;
dwResult, cEntries: DWORD;
dwResultEnum: DWORD;
lpnrLocal: array of TNetResource;
Has: Boolean; //是否包含网络资源;
begin
cbBuffer := SizeOf(TNetResource) * 1024;
cEntries := $FFFFFFFF;
dwResult := WNetOpenEnum(RESOURCE_GLOBALNET,
RESOURCETYPE_ANY,
RESOURCEUSAGE_CONTAINER,
lpnr, hEnum);
if dwResult <> NO_ERROR then
begin
Result := False;
Exit;
end;
Has := False;
repeat
SetLength(lpnrLocal, 1024);
ZeroMemory(lpnrLocal, SizeOf(lpnrLocal));
Application.ProcessMessages;
dwResultEnum := WNetEnumResource(hEnum, cEntries, lpnrLocal, cbBuffer);
if dwResultEnum = NO_ERROR then
begin
Has := True;
for nLoop := 0 to cEntries - 1 do
begin
Node := AddTolvUser(ANode, @lpnrLocal[nLoop]);
if lpnrLocal[nLoop].dwDisplayType in //只枚举Domain和PC
[RESOURCEDISPLAYTYPE_NETWORK, RESOURCEDISPLAYTYPE_DOMAIN] then
if not EnumPCsInNetWork(Node, @lpnrLocal[nLoop]) then
case lpnrLocal[nLoop].dwDisplayType of
RESOURCEDISPLAYTYPE_NETWORK:
begin
Node.ImageIndex := NoNetWork;
Node.SelectedIndex := NoNetWork;
end;
RESOURCEDISPLAYTYPE_DOMAIN:
begin
Node.ImageIndex := NoDomain;
Node.SelectedIndex := NoDomain;
end;
end;
end;
end else
if dwResultEnum <> ERROR_NO_MORE_ITEMS then Break;
until (dwResultEnum = ERROR_NO_MORE_ITEMS);
Result := (WNetCloseEnum(hEnum) = NO_ERROR) and Has;
end;