那位大侠可以给小第讲一下怎样可以获得网络中可用的计算机名,方法简单最后。

解决方案 »

  1.   

    在DELPHI程序中获取网络资源信息
    1.获取网络类型信息
      局域网中可以是由多和类型的网络组成,用API函数WNETOPENENUM和WNETENUMRESOURCE可以获取网络类型信息。
      用WNETOPENENUM 函数返回一个句柄,作为WNETENUMRESOURCE列举网络资源的依据,列举“整个网络”的工作组名称,
    因而网络范围为Resource_GloalNet(所有机器),资源类型为ResourceType_Disk (文件资源),资源用途
    为ResourceUsage_Container(所有container资源),网络层次为最高层(NIL),这样可以得到一个句柄以便列举网络资源。
      主要源代码如下:
      {Res: DWORD;lphEnum:THandle;}
      res := WNetOpenEnum( Resourece_GlobalNet, ResourceType_Disk,ResourceUsage_Container,Nil,lphEnum);
      //执行失败
      If Res <> NO_Error then exit;
      用API函数WNETENUMRESOURCE可以获取网络类型信息,此时要用到上面获取的句柄lphEnum,可以获取一个NetResource类型
    的数组,每个NETRESOURCE元素即为一和网络类型信息。WNetOpenenum用于获取一个网络资源句柄,作为WNenEnumResource列举网络资源的依据,其函数原型如
      function WNetOpenEnum(dwScope)//网络范围,Resource_Connected//已连接机器)
    ,Resource_GlobalNet//所有机器,Resource_Remembered//已记忆的机器,dwType//资源类型
    ,ResourceTpye_Any//所有资源,ResourceType_Disk//文件资源,ResourceType_Print//打印资源,dwUsage//资源用途,0//所有资源,ResourceUsage_ConnectAble//所有可连接资源
    ,ResourceUsage_Container//所有container资源,仅在dwScope为ResourceE_GlobalNet 有效。
      
    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
        //获取某个网络类型的文件资源的句柄,lphInum为返回句柄
        Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK, RESOURCEUSAGE_CONTAINER, Nil,lphEnum);
        If Res <> 0 Then Raise Exception(Res);  //执行失败    //获取整个网络中的网络类型信息
        Count := $FFFFFFFF;    //不限资源数目
        BufSize := 8192;       //缓冲区大小设置为8K    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);       //WNETCLOSEENUM关闭一个列举句柄
        If Res <> 0 Then Raise Exception(Res);
        For J := 0 To NetworkTypeList.Count-1 Do    //列出各个网络类型中的所有工作组名称
        Begin                                       //列出一个网络类型中的所有工作组名称
          TempRec := NetworkTypeList.Items[J];
          NetResource := TNetResource(TempRec^);    //网络类型信息
          //获取某个网络类型的文件资源的句柄,NETRESOURCE为网络类型信息,lphInum为返回句柄
          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;       //缓冲区大小设置为8K          //获取一个网络类型的文件资源信息
            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
    //RESULT := FALSE;  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;         //缓冲区大小设置为8K
          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
            //获取工作组的计算机名称,+2表示删除“\”,如\khr=>khr
            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;