求局域网内所有IP和计算机名下拉列表
最好是写在一个方法里我一调的

解决方案 »

  1.   


      參考此貼代碼: http://topic.csdn.net/t/20040508/10/3040713.html
      

  2.   


      參考此貼代碼: http://topic.csdn.net/t/20040508/10/3040713.html
      

  3.   

    procedure Tfeiyan.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
      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);
        Finally
          FreeMem(Buf);
          NetworkTypeList.Destroy;
        End;
          List.EndUpdate;   
    end;
    以上是获得计算机名
    function Tfeiyan.nametoip(name: string): string;
    var   
      WSAData:TWSAData;
      HostEnt:PHostEnt;
    begin
      result:='';   
      WSAStartup(2,WSAData);
      HostEnt:=gethostbyname(PChar(name));
      if HostEnt<>nil then
      begin   
        with   HostEnt^   do
        result:=Format('%d.%d.%d.%d',[Byte(h_addr^[0]),Byte(h_addr^[1]),Byte(h_addr^[2]),Byte(h_addr^[3])]);
      end;   
      WSACleanup;   
    end;
    根据计算机名获取IP