Código Delphi
[-]var Items: array [0..32767] of TNetResource;
procedure AddResources(NodeName: string; List: TStrings);
var hEnum, Count, Size: Cardinal;
begin
Items[0].lpRemoteName := PChar(NodeName);
Count := $FFFFFFFF; Size := SizeOf(Items);
WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK, 0, @Items, hEnum);
WNetEnumResource(hEnum, Count, @Items, Size);
WNetCloseEnum(hEnum);
while LongBool(Count) do
begin
Dec(Count);
List.Add(Items[Count].lpRemoteName);
end;
end;
El procedimiento anterior añade a una lista, los recursos de disco disponibles en una red; el parámetro es el nodo desde el cual se realizará la enumeración.
Con el
truco se puede realizar un árbol tal cual se ve con el explorador en "Mis sitios de red".
En el siguiente ejemplo se enumerarán todas las carpetas compartidas en nuestro grupo de trabajo, suponemos la copia del anterior código en la misma unidad.
Código Delphi
[-]type
PWkstaInfo100 = ^TWkstaInfo100;
TWkstaInfo100 = record
wki100_platform_id: Cardinal;
wki100_computername,
wki100_langroup: PWideChar;
wki100_ver_major,
wki100_ver_minor: Cardinal;
end;
function NetWkstaGetInfo(server: PWideChar; level: Cardinal; bufptr: Pointer): Cardinal; stdcall; external 'netapi32.dll';
procedure TForm1.Button1Click(Sender: TObject);
var
Info: PWkstaInfo100;
Index: Cardinal;
begin
if not LongBool(NetWkstaGetInfo(nil, 100, @Info)) and Assigned(Info) then
begin
ListBox1.Items.Clear;
AddResources(string(Info.wki100_langroup), ListBox1.Items);
LocalFree(Cardinal(Info));
Index := ListBox1.Count;
while LongBool(Index) do
begin
AddResources(ListBox1.Items[0], ListBox1.Items);
ListBox1.Items.Delete(0);
Dec(Index);
end;
end;
end;
PD: Normalmente no hago un control excesivo de excepciones debido a que la incidencia de éstos esta dada por meras fallas en tiempo de diseño y no así de ejecución.