win9x/winNT下如何获得网上邻居中存在的计算机的主机名和IP地址

解决方案 »

  1.   

    得到所有工作组:
    function TForm1.GetServerList(var List: TStringList): Boolean;
    Var
    NetResource : TNetResource;
    Buf : Pointer;
    Count,BufSize,Res : DWORD;
    lphEnum : THandle;
    p:TNetResourceArray;
    i,j : SmallInt;
    NetworkTypeList : TList;
    Begin
    Result := False;
    NetworkTypeList := TList.Create;
    List.Clear;
    Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
    RESOURCEUSAGE_CONTAINER, Nil,lphEnum);
    //获取整个网络中的文件资源的句柄,lphEnum为返回名柄
    If Res <> NO_ERROR Then exit;
    //执行失败,退出//执行成功,开始获取整个网络中的网络类型信息
    Count := $FFFFFFFF;
    //不限资源数目
    BufSize := 8192;
    //缓冲区大小设置为8K
    GetMem(Buf, BufSize);
    //申请内存,用于获取工作组信息
    Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
    If ( Res = ERROR_NO_MORE_ITEMS )
    //资源列举完毕
    or (Res <> NO_ERROR )
    //执行失败
    Then Exit;P := TNetResourceArray(Buf);
    For I := 0 To Count - 1 Do
    //记录各个网络类型的信息
    Begin
    NetworkTypeList.Add(p);
    Inc(P);
    End;//WNetCloseEnum关闭一个列举句柄
    Res:= WNetCloseEnum(lphEnum);
    //关闭一次列举
    If Res <> NO_ERROR Then exit;
    For J := 0 To NetworkTypeList.Count-1 Do
    //列出各个网络类型中的所有工作组名称
    Begin
    //列出一个网络类型中的所有工作组名称
    NetResource := TNetResource(NetworkTypeList.Items[J]^);
    //网络类型信息
    //获取某个网络类型的文件资源的句柄,NetResource为网络类型信息,lphEnum为返回名柄
    Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
    RESOURCEUSAGE_CONTAINER, @NetResource,lphEnum);
    If Res <> NO_ERROR Then break;
    //执行失败
    While true Do
    //列举一个网络类型的所有工作组的信息
    Begin
    Count := $FFFFFFFF;
    //不限资源数目
    BufSize := 8192;
    //缓冲区大小设置为8K
    GetMem(Buf, BufSize);
    //申请内存,用于获取工作组信息,获取一个网络类型的文件资源信息,
    Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
    If ( Res = ERROR_NO_MORE_ITEMS )
    //资源列举完毕
    or (Res <> NO_ERROR)
    //执行失败
    then break;
    P := TNetResourceArray(Buf);
    For I := 0 To Count - 1 Do
    //列举各个工作组的信息
    Begin
    List.Add( StrPAS( P^.lpRemoteName ));
    //取得一个工作组的名称
    Inc(P);
    End;
    End;
    Res := WNetCloseEnum(lphEnum);
    //关闭一次列举
    If Res <> NO_ERROR Then break;
    //执行失败
    End;
    Result := True;
    FreeMem(Buf);
    NetworkTypeList.Destroy;
    End;得到一个工作组中所有用户:
    Function TForm1.GetUsers(GroupName:string):Boolean;
    Var
      NetResource:TNetResource;
      Buf : Pointer;
      Count,BufSize,Res : DWord;
      Ind : Integer;
      lphEnum : THandle;
      Temp:TNetResourceArray;
      IP:string;
    Begin  Result := False;
      //List.Clear;  FillChar(NetResource, SizeOf(NetResource), 0);  //初始化网络层次信息
      NetResource.lpRemoteName := @GroupName[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 <> NO_ERROR Then Exit; //执行失败
     While True Do          //列举指定工作组的网络资源
      Begin
       Count := $FFFFFFFF; //不限资源数目
       BufSize := 8192;    //缓冲区大小设置为8K
       GetMem(Buf, BufSize);//申请内存,用于获取工作组信息,获取计算机名称
       Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
      If Res = ERROR_NO_MORE_ITEMS Then break;//资源列举完毕
      If (Res <> NO_ERROR) then Exit;//执行失败
        Temp := TNetResourceArray(Buf);
       For Ind := 0 to Count - 1 do//列举工作组的计算机名称
         Begin
           IP:=copy(Temp^.lpRemoteName,3,length(Temp^.lpRemoteName));
           if IP<>mycomputer.IP then
             CID.add (IP);
                Inc(Temp);     End;
     End;
     Res := WNetCloseEnum(lphEnum);//关闭一次列举
    If Res <> NO_ERROR Then exit;//执行失败
      Result:=True;
      FreeMem(Buf);end;
    用用户名得到IP地址:function TForm1.GetIP(Computer: string): string;
    var
      WSAData: TWSAData;
      HostEnt: PHostEnt;
      sComputerName, sIP: string;
    begin
      sComputername:=Computer;
      WSAStartup(2, WSAData);
      HostEnt := gethostbyname(PChar(sComputerName));
      if HostEnt <> nil then
      begin
        with HostEnt^ do
          sIP := Format('%d.%d.%d.%d', [Byte(h_addr^[0]), Byte(h_addr^[1]), Byte(h_addr^[2]), Byte(h_addr^[3])]);  end;
      WSACleanup;
      GetIP:=sIP;
    end;
      

  2.   

    Function GetUsers(GroupName:string;var List:TStringList):Boolean;
    Var
      NetResource:TNetResource;
      Buf : Pointer;
      Count,BufSize,Res : DWord;
      Ind : Integer;
      lphEnum : THandle;
      Temp:TNetResourceArray;
    Begin
      Result := False;
      List.Clear;
      FillChar(NetResource, SizeOf(NetResource), 0);  //初始化网络层次信息
      NetResource.lpRemoteName := @GroupName[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 <> NO_ERROR Then Exit; //执行失败
     While True Do          //列举指定工作组的网络资源
      Begin
       Count := $FFFFFFFF; //不限资源数目
       BufSize := 8192;    //缓冲区大小设置为8K
       GetMem(Buf, BufSize);//申请内存,用于获取工作组信息,获取计算机名称
       Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
      If Res = ERROR_NO_MORE_ITEMS Then break;//资源列举完毕
      If (Res <> NO_ERROR) then Exit;//执行失败
        Temp := TNetResourceArray(Buf);
       For Ind := 0 to Count - 1 do//列举工作组的计算机名称
         Begin
           List.Add(Temp^.lpRemoteName);
           Inc(Temp);
         End;
     End;
     Res := WNetCloseEnum(lphEnum);//关闭一次列举
    If Res <> NO_ERROR Then exit;//执行失败
      Result:=True;
      FreeMem(Buf);
    end;
      

  3.   

    TNetResourceArray是在哪个unit里面的?
      

  4.   

    WinSock里面也没有TNetResourceArray呀
      

  5.   

    TNetResourceArray = ^TNetResource