Try API functions:
WNetOpenEnum,WNetEnumResource

解决方案 »

  1.   

    刚好,我写了一段代码,希望对你有所帮助,大致如下(如有问题,请Mail给我。上次对不起,我不是有意的):
    //将其加入到一个TTreeView(tvUser)对象:
    function TfrmChat.AddTolvUser(const ANode: TTreeNode; const lpns: PNetResource): TTreeNode;
    var Node: TTreeNode;
        pCaption: String;
    begin
      pCaption := KillChars(lpns.lpRemoteName, ['\'], True);
      Node := tvUser.Items.AddChild(ANode, pCaption);
      case lpns.dwDisplayType of
        RESOURCEDISPLAYTYPE_NETWORK:  //整个网络
          Node.ImageIndex := NetWork;
        RESOURCEDISPLAYTYPE_DOMAIN:   //一个域
          Node.ImageIndex := DoMain;
        RESOURCEDISPLAYTYPE_SERVER:   //一台PC机
          Node.ImageIndex := PC;
        else                          //不会发生,避免编译警告
          Node.ImageIndex := PC;
      end;
      Node.SelectedIndex := Node.ImageIndex;
      Node.StateIndex := CheckNone;
      Result := Node;
    end;//第一次ANode可以为nil,如EnumPCsInNetWork(ANode, nil);或者EnumPCsInNetWork(nil);
    function TfrmChat.EnumPCsInNetWork(const ANode: TTreeNode; const lpnr: PNetResource = nil): Boolean;
    var hEnum: THANDLE;
        Node: TTreeNode;
        cbBuffer, nLoop: DWORD;
        dwResult, cEntries: DWORD;
        dwResultEnum: DWORD;
        lpnrLocal: array of TNetResource;
        Has: Boolean; //是否包含网络资源;
    begin
      cbBuffer := SizeOf(TNetResource) * 1024;
      cEntries := $FFFFFFFF;
      dwResult := WNetOpenEnum(RESOURCE_GLOBALNET,
                               RESOURCETYPE_ANY,
                               RESOURCEUSAGE_CONTAINER,
                               lpnr, hEnum);
      if dwResult <> NO_ERROR then
      begin
        Result := False;
        Exit;
      end;
      Has := False;
      repeat
        SetLength(lpnrLocal, 1024);
        ZeroMemory(lpnrLocal, SizeOf(lpnrLocal));
        Application.ProcessMessages;
        dwResultEnum := WNetEnumResource(hEnum, cEntries, lpnrLocal, cbBuffer);
        if dwResultEnum = NO_ERROR then
        begin
          Has := True;
          for nLoop := 0 to cEntries - 1 do
          begin
            Node := AddTolvUser(ANode, @lpnrLocal[nLoop]);
            if lpnrLocal[nLoop].dwDisplayType in //只枚举Domain和PC
               [RESOURCEDISPLAYTYPE_NETWORK, RESOURCEDISPLAYTYPE_DOMAIN] then
            if not EnumPCsInNetWork(Node, @lpnrLocal[nLoop]) then
            case lpnrLocal[nLoop].dwDisplayType of
              RESOURCEDISPLAYTYPE_NETWORK:
                begin
                  Node.ImageIndex := NoNetWork;
                  Node.SelectedIndex := NoNetWork;
                end;
              RESOURCEDISPLAYTYPE_DOMAIN:
                begin
                  Node.ImageIndex := NoDomain;
                  Node.SelectedIndex := NoDomain;
                end;
            end;
          end;
        end else
        if dwResultEnum <> ERROR_NO_MORE_ITEMS then Break;
      until (dwResultEnum = ERROR_NO_MORE_ITEMS);
      Result := (WNetCloseEnum(hEnum) = NO_ERROR) and Has;
    end;
      

  2.   

    To Lin:
      对于你的热情帮助,我深深感激。
      对于你的渊博,在下的景仰之情,犹如滔滔江水.....
      
      怎么还用的着说对不起呢,你太客气了,让我很不好意思。