ネットワークリソースを列挙する
ネットワークのリソース(エクスプローラのネットワーク全体から見渡せるすべてのオブジェクト)を列挙するには 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できるようにしました。