ネットワークリソースを列挙する
ネットワークのリソース(エクスプローラのネットワーク全体から見渡せるすべてのオブジェクト)を列挙するには WNetOpenEnum APIを使って列挙ハンドルを取得して、WNetEnumResource APIを使ってリソースを調べます。このAPIにはさらに TNetResource構造体が必要になります。さらにこれを配列にした TNetResourceArray構造体も使います。列挙する場合はその関数は再帰的に使われることが多いのですが、この場合もそうなります。ただコールバックではありません。WNetEnumResource関数に Nullを渡せばルートを返してくるので次回からはそれを使ってどんどん下層ノードを調べていきます。
| ■ ネットワークリソースを列挙する例 |
procedure TForm1.btnEnumClick(Sender: TObject);
begin
{初期処理}
sltNetEnum.Clear;
sltNetEnum.BeginUpdate;
{列挙関数の呼び出し : 1)NETRESOURCE構造体 2)TreeNode}
EnumerateFunc(nil);
{終了処理}
sltNetEnum.EndUpdate;
end;
function TForm1.EnumerateFunc(lpnr : PNETRESOURCE) : boolean;
type
{NETRESOURCE構造体}
PNetResourceArray = ^TNetResourceArray;
TNetResourceArray = array[0..MaxInt div SizeOf(TNetResource) - 1] of TNetResource;
var
hEnum : THandle; {列挙ハンドル}
cEntries : integer; {要求エントリ数}
BufSize : integer; {バッファサイズ(NETRESOURCEのサイズ)}
ix : integer; {添え字}
NetResources : PNetResourceArray; {バッファ用}
begin
{ネットワークリソースの列挙を開始する}
if WNetOpenEnum (RESOURCE_GLOBALNET,RESOURCETYPE_ANY,0,lpnr,hEnum) <> NO_ERROR then begin
{失敗}
WNetCloseEnum(hEnum);
Result := False;
exit;
end;
{バッファの確保}
BufSize := 50 * SizeOf(TNetResource); {十分なサイズを与えろ!}
GetMem(NetResources, BufSize);
cEntries := -1;
{リソース情報の取得 : ここがメイン}
if WNetEnumResource( hEnum,cEntries,NetResources,BufSize) <> NO_ERROR then begin
{失敗}
WNetCloseEnum(hEnum);
FreeMem(NetResources, BufSize);
Result := False;
exit;
end;
{取得できたリソース情報をリストへ }
for ix := 0 to cEntries - 1 do begin
{ローカル名}
sltNetEnum.Add(NetResources^[ix].lpLocalName);
{リモート名}
sltNetEnum.Add(NetResources^[ix].lpRemoteName);
{コメントは}
sltNetEnum.Add(NetResources^[ix].lpComment);
{さらに下の階層がある場合}
if (RESOURCEUSAGE_CONTAINER = (NetResources^[ix].dwUsage and RESOURCEUSAGE_CONTAINER)) then begin
{再帰的に自分を呼び出せ}
EnumerateFunc(@NetResources[ix]);
end;
end;
{列挙ハンドルの閉鎖}
WNetCloseEnum(hEnum);
{バッファの開放}
FreeMem(NetResources, BufSize);
Result := True;
end;
|
これのサンプルソースをDLできるようにしました。