要获得计算机名,请使用GetHostByAddressAPI函数吧!

解决方案 »

  1.   

    GetHostByAddr如何使用
    请指教(最好有原码)
      

  2.   


                   //*在网络邻居中获取所有的工作组及计算机名*//
                   
               //*注;如在网络邻居的TCP/IP属性中设置(DNS,网关)后,*//
               //*其运行速度将变得奇慢,在下倒想请教各位,有何良方。*//unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, ExtCtrls ,winsock;type
      TNetResourceArray = ^TNetResource;  //网络资源类型的数组
      TForm1 = class(TForm)
        Memo1: TMemo;
        Panel1: TPanel;
        Button1: TButton;
        Button2: TButton;
        Timer1: TTimer;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure Button2Click(Sender: TObject);
        procedure FormShow(Sender: TObject);
        procedure Timer1Timer(Sender: TObject);
      private
        { Private declarations }
        function GetIP(Sender: TObject; fcomputername:string) :string;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}                //函数GetServerList列举出整个网络中的工作组名称,返回值为TRUE表示执行成功,
    Function GetServerList( var List : TStringList ) : Boolean; //参数List中返回服务器(工作组)的名称
    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;   //不限资源数目
        GetMem(Buf, BufSize); //缓冲区大小设置为8K
        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;
        Res:= WNetCloseEnum(lphEnum); //WNetCloseEnum关闭一个列举句柄
        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 := 1024*16;     //缓冲区大小设置为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.GetIP(Sender: TObject; fcomputername:string) :string;
    var
        WSAData: TWSAData;
        HostEnt: PHostEnt;
    begin
        HostEnt := nil;
        WSAStartup(2, WSAData);
        HostEnt := gethostbyname(PChar(fComputerName));
        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;procedure TForm1.Button1Click(Sender: TObject);
    var
     sl,s2:TstringList;
     i,j,k:integer;
     temp:string;
    begin
       temp:='d:\computer.txt';
       memo1.lines.Clear;
       sl:=Tstringlist.create;
       s2:=Tstringlist.create;
       try
          if GetServerList(sl) then
          begin
           for i:=0 to sl.count-1 do
            begin
               memo1.lines.Add (sl.Strings[i]+':');
               try
                 winexec(pchar('command.com /C net view /workgroup:'+sl.Strings[i]+' >'+temp),sw_hide);
               except
               end;
               k:=120;
               repeat;
                 sleep(k);
                 k:=k+40;
               until
                fileexists(temp);
               s2.LoadFromFile(temp);
               for j:=1 to s2.count-1 do
               begin
                 if pos(':',s2.Strings[j]) >0 then
                     memo1.lines.Add (s2.Strings[j]);
                 if pos('\\',s2.Strings[j]) >0 then
                     memo1.lines.Add (' '+copy(s2.Strings[j],1,15)+' IP: '+ GetIP(Sender,trim(copy(s2.Strings[j],3,20))));
                end;
           end;
           memo1.lines.Add('工作组个数:'+inttostr(sl.count));
          end
          else
           memo1.lines.Add('没有找到工作组!');
       except
       end;end;procedure TForm1.FormCreate(Sender: TObject);
    begin
       memo1.lines.Clear;
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
       memo1.lines.SaveToFile('LKnet.spl');
       action:=cafree;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
       close;
    end;procedure TForm1.FormShow(Sender: TObject);
    begin
       IF fileexists('LKnet.spl')  then
         Memo1.Lines.LoadFromFile('LKnet.spl');
    end;procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      if pos('工作组个数', memo1.Text) =0 then
         button1click(sender);
    end;end.
      

  3.   

    补充一点,问题主要出在函数(gethostbyname)上。
      

  4.   

    获得工作组、所有计算机名(计算机说明)、由计算机名获得IP地址
    我都知道
    只是如何根据某个IP地址得到它的计算机名及计算机说明?
    谢谢大家
      

  5.   

    看看这个行不:
    procedure TServerForm.GetHostNameAddr;
    var
       buf   : array[0..MAX_PATH] of char;
       he    : PHostEnt;
       buf2  : PChar;
       rc    : integer;
    begin
       rc := GetHostName(buf, sizeof(buf));   if rc<>SOCKET_ERROR then begin
          he := GetHostByName(buf);
          if he = nil then begin
             rc := WSAGetLastError;
             NameLabel.Caption := Format('Socket Error %d = %s', [rc, SysErrorMessage(rc)]);
          end else begin
             buf2 := inet_ntoa(PInAddr(he.h_addr^)^);
             NameLabel.Caption := Format('%s  (%s)', [buf, buf2]);
          end;
       end else begin
          NameLabel.Caption := 'Unknown Host';
       end;
    end;