http://delphi.yesite.com/my_data/get_net_friend.htm也许对你有所帮助

解决方案 »

  1.   

    type
      PnetResourceArr = ^TNetResource;implementation
    procedure GetServerList(List:TStrings);
    Type
      {$H+}
      PMyRec = ^MyRec;
       MyRec = Record
                 dwScope       : Integer;
                 dwType        : Integer;
                 dwDisplayType : Integer;
                 dwUsage       : Integer;
                 LocalName     : String;
                 RemoteName    : String;
                 Comment       : String;
                 Provider      : String;
               End;
      {H-}
    Var
      NetResource : TNetResource;
      TempRec     : PMyRec;
      Buf         : Pointer;
      Count,
      BufSize,
      Res         : DWORD;
      lphEnum     : THandle;
      p           : PNetResourceArr;
      i,
      j           : SmallInt;
      NetworkTypeList : TList;
    begin
     // Result := False;  NetworkTypeList := TList.Create;
      List.BeginUpdate;
      List.Clear;
      GetMem(Buf, 8192);
      Try
        Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK, RESOURCEUSAGE_CONTAINER, Nil,lphEnum);
        If Res <> 0 Then Raise Exception(Res);
        Count := $FFFFFFFF;
        BufSize := 8192;
        Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
        If Res = ERROR_NO_MORE_ITEMS Then Exit;
        If (Res <> 0) Then Raise Exception(Res);
        P := PNetResourceArr(Buf);
        For I := 0 To Count - 1 Do
        Begin
          New(TempRec);
          TempRec^.dwScope := P^.dwScope;
          TempRec^.dwType := P^.dwType ;
          TempRec^.dwDisplayType := P^.dwDisplayType ;
          TempRec^.dwUsage := P^.dwUsage ;
          TempRec^.LocalName := StrPas(P^.lpLocalName);
          TempRec^.RemoteName := StrPas(P^.lpRemoteName);
          TempRec^.Comment := StrPas(P^.lpComment);
          TempRec^.Provider := StrPas(P^.lpProvider);
          NetworkTypeList.Add(TempRec);
          Inc(P);
        End;
        Res := WNetCloseEnum(lphEnum);
        If Res <> 0 Then Raise Exception(Res);
        For J := 0 To NetworkTypeList.Count-1 Do
        Begin
          TempRec := NetworkTypeList.Items[J];
          NetResource := TNetResource(TempRec^);
          Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK, RESOURCEUSAGE_CONTAINER, @NetResource,lphEnum);
          If Res <> 0 Then Raise Exception(Res);
          While true Do
          Begin
            Count := $FFFFFFFF;
            BufSize := 8192;
            Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
            If Res = ERROR_NO_MORE_ITEMS Then Break;
            If (Res <> 0) Then Raise Exception(Res);
            P := PNetResourceArr(Buf);
            For I := 0 To Count - 1 Do
            Begin
              List.Add(P^.lpRemoteName);
              Inc(P);
            End;
          End;
        End;
        Res := WNetCloseEnum(lphEnum);
        If Res <> 0 Then Raise Exception(Res);
        //Result := True;
        Finally
          FreeMem(Buf);
          NetworkTypeList.Destroy;
      End;
      List.EndUpdate;
    end;procedure GetUserList(fServer:string;List:TStrings);
    Var
      NetResource : TNetResource;
      Buf         : Pointer;
      Count,
      BufSize,
      Res         : DWord;
      Ind         : Integer;
      lphEnum     : THandle;
      Temp        : PNetResourceArr;
    Begin
      List.Clear;
      GetMem(Buf, 8192);
      Try
        FillChar(NetResource, SizeOf(NetResource), 0);
        NetResource.lpRemoteName := @fServer[1];
        NetResource.dwDisplayType := RESOURCEDISPLAYTYPE_SERVER;
        NetResource.dwUsage := RESOURCEUSAGE_CONTAINER;
        NetResource.dwScope := RESOURCETYPE_DISK;
        Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK, RESOURCEUSAGE_CONTAINER, @NetResource,lphEnum);
        If Res <> 0 Then Exit;
        While True Do
        Begin
          Count := $FFFFFFFF;
          BufSize := 8192;
          Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
          If Res = ERROR_NO_MORE_ITEMS Then Exit;
          If (Res <> 0) then Exit;
          Temp := PNetResourceArr(Buf);
          For Ind := 0 to Count - 1 do
          Begin
            List.Add(Temp^.lpRemoteName + 2); { Add all the network usernames to List StringList }
            Inc(Temp);
          End;
        End;
        Res := WNetCloseEnum(lphEnum);
        If Res <> 0 Then Raise Exception(Res);
    //    Result := True;
      Finally
        FreeMem(Buf);
      End;
    End;这程序是网上来的,我整理了一个,就变成现在这样了。
    procedure oncreate;
    begin GetServerList(Listbox1.Items);end;
    procedure Listbox1.Onclick
    begin
      GetUserList(Listbox1.Items[Listbox1.ItemIndex],Listbox2.Items);
    end;
      

  2.   

    看了saoren(qsl)兄的答复,我真是觉得自己在DELPHI和WIN API上差得太远了。以前也看过saoren(qsl)兄回答的别人的问题,真是高手啊,佩服佩服。能告诉我你在哪个城市吗?也许日后有合作的机会
      

  3.   

    我差不多也是copy过来的,API我懂得也不多,
    我现在在佛山,以后都不知去哪。呵。