ネットワークリソースを列挙する

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

netenum.lzh