Как узнать все доступные сетевые pесуpсы?
uses
..., ComCtrls;
type
PNetResourceArray = ^TNetResourceArray;
TNetResourceArray = array[0..MaxInt div SizeOf( TNetResource )-1] of TNetResource;
procedure EnumResources(LpNR: PNetResource);
var
NetHandle: THandle;
BufSize: integer;
Size: integer;
NetResources: PNetResourceArray;
Count: Integer;
NetResult: integer;
i: integer;
NewItem: TListItem;
begin
if WNetOpenEnum( RESOURCE_GLOBALNET,
RESOURCETYPE_ANY,
// RESOURCETYPE_ANY - все ресурсы // RESOURCETYPE_DISK - диски
// RESOURCETYPE_PRINT - принтеры
0, LpNR, NetHandle) <> NO_ERROR then Exit;
try
BufSize := 50 * SizeOf( TNetResource );
GetMem( NetResources, BufSize );
try
while true do
begin
Count := -1;
Size := BufSize;
NetResult := WNetEnumResource( NetHandle, Cardinal( Count ), NetResources, Cardinal( 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
// ^^^^^^^^^^^^^^^^^^^^^^^^^^ - ресурс
// RESOURCEDISPLAYTYPE_SERVER - компьютер
// RESOURCEDISPLAYTYPE_DOMAIN - рабочая группа // RESOURCEDISPLAYTYPE_GENERIC - сеть
begin
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 |