type
PNetResourceArray = ^TNetResourceArray;
TNetResourceArray = array[0..MaxInt div SizeOf(TNetResource) - 1]
of TNetResource;
procedure EnumResources(LpNR: PNetResource);
var
NetHandle: THandle;
I, BufSize, NetResult: Integer;
NetResources: PNetResourceArray;
NewItem: TListItem;
Count, Size: DWORD;
begin
if WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, LpNR,
NetHandle) <> NO_ERROR then Exit;
try
BufSize := 50 * SizeOf(TNetResource);
GetMem(NetResources, BufSize);
try
while True do begin
Count := $FFFFFFFF;
Size := BufSize;
NetResult := WNetEnumResource(NetHandle, Count, NetResources, Size);
if NetResult = ERROR_MORE_DATA then begin
BufSize := Size;
ReallocMem(NetResources, BufSize);
Continue;
end;
if NetResult <> NO_ERROR then Exit;
for I := 0 to Count-1 do begin
with NetResources^[I] do begin
if RESOURCEUSAGE_CONTAINER = (DwUsage and RESOURCEUSAGE_CONTAINER) then
EnumResources(@NetResources^[I]);
if dwDisplayType = RESOURCEDISPLAYTYPE_SHARE then begin
// ^^^^^^^^^^^^^^^^^^^^^^^^^ - ресурс
// RESOURCEDISPLAYTYPE_SERVER - компьютер
// RESOURCEDISPLAYTYPE_DOMAIN - рабочая группа
// RESOURCEDISPLAYTYPE_GENERIC - сеть
NewItem := Form1.ListView1.Items.Add;
NewItem.Caption := LpRemoteName;
end;
end;
end;
end;
finally
FreeMem(NetResources, BufSize);
end;
finally
WNetCloseEnum(NetHandle);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
OldCursor: TCursor;
begin
OldCursor := Screen.Cursor;
Screen.Cursor := crHourGlass;
with ListView1.Items do begin
BeginUpdate;
Clear;
EnumResources(nil);
EndUpdate;
end;
Screen.Cursor := OldCursor;
end;
[Nomadic]
Примечание
Добавляем в uses модуль ComCtrls.