Enumerate Remote Shares via WNetEnumResource - Delphi

DarkCoderSc
Jean-Pierre LESUEUR
uses
System.SysUtils, Winapi.Windows, Generics.Collections;
// ...
function EnumerateRemoteShares(var AList : TList<String>) : Cardinal;
begin
result := 0;
///
if not Assigned(AList) then
AList := TList<String>.Create()
else
AList.Clear();
var AEnumHandle : THandle;
var AResult := WNetOpenEnumW(
RESOURCE_CONNECTED,
RESOURCETYPE_DISK,
0,
nil,
AEnumHandle
);
if AResult <> NO_ERROR then
raise EWindowsException.Create('WNetOpenEnumW');
try
const AMinimumBufferSize = 16 * 1024; // 16KiB
// 16KiB should be way enought!
var ABufferSize : DWORD := AMinimumBufferSize;
var pBuffer : PNetResource;
GetMem(pBuffer, ABufferSize);
try
var AEntriesCount := DWORD(-1); // All
var ABufferRealSize := ABufferSize;
AResult := WNetEnumResourceW(
AEnumHandle,
AEntriesCount,
pBuffer,
ABufferRealSize
);
if AResult <> NO_ERROR then
raise EWindowsException.Create('WNetEnumResourceW', AResult);
for var I := 0 to AEntriesCount -1 do begin
var pCurrentNetworkResource := PNetResource(NativeUInt(pBuffer) + (I * SizeOf(TNetResource)));
AList.Add(pCurrentNetworkResource^.lpRemoteName);
end;
finally
FreeMem(pBuffer, ABufferSize);
end;
finally
WNetCloseEnum(AEnumHandle);
end;
///
result := AList.Count;
end;
// ...
begin
try
var AList := TList<String>.Create();
try
var ARemoteSharesCount := EnumerateRemoteShares(AList);
if ARemoteSharesCount > 0 then begin
WriteLn(Format('Displaying %d share(s):', [ARemoteSharesCount]));
for var ARemoteShare in AList do
WriteLn(#9 + ARemoteShare);
end else
WriteLn('No remote share so far!');
finally
FreeAndNil(AList);
end;
except
on E : Exception do
WriteLn(E.Message);
end;
// ...
Creating and researching code snippets takes time and effort. You’re welcome to share them through your own platforms, but please don’t forget to credit the original author, here: Jean-Pierre LESUEUR.
Depends On
Implemented By Technique
Featured Windows APIs
Created
May 13, 2025
Last Revised
May 14, 2025