查找所有网络计算机
  调用FindComputers,返回WinAPI错误代码(如果有的话)。这个函数将会在TStringList类型的Computers对象中填入计算机名称。    以下代码是在Delphi5上开发的,但是应该是向后兼容的。    Answer:      unit FindComp;    interface    uses  Windows, Classes;    function FindComputers: DWORD;    var  Computers: TStringList;    implementation    uses  SysUtils;    const  MaxEntries = 250;    function FindComputers: DWORD;    var  EnumWorkGroupHandle, EnumComputerHandle: THandle;  EnumError: DWORD;  Network: TNetResource;  WorkGroupEntries, ComputerEntries: DWORD;  EnumWorkGroupBuffer, EnumComputerBuffer: array[1..MaxEntries] of TNetResource;  EnumBufferLength: DWORD;  I, J: DWORD;    begin    Computers.Clear;    FillChar(Network, SizeOf(Network), 0);  with Network do  begin  dwScope := RESOURCE_GLOBALNET;  dwType := RESOURCETYPE_ANY;  dwUsage := RESOURCEUSAGE_CONTAINER;  end;    EnumError := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, @Network, EnumWorkGroupHandle);    if EnumError = NO_ERROR then  begin  WorkGroupEntries := MaxEntries;  EnumBufferLength := SizeOf(EnumWorkGroupBuffer);  EnumError := WNetEnumResource(EnumWorkGroupHandle, WorkGroupEntries, @EnumWorkGroupBuffer, EnumBufferLength);    if EnumError = NO_ERROR then  begin  for I := 1 to WorkGroupEntries do  begin  EnumError := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, @EnumWorkGroupBuffer[I], EnumComputerHandle);  if EnumError = NO_ERROR then  begin  ComputerEntries := MaxEntries;  EnumBufferLength := SizeOf(EnumComputerBuffer);  EnumError := WNetEnumResource(EnumComputerHandle, ComputerEntries, @EnumComputerBuffer, EnumBufferLength);  if EnumError = NO_ERROR then  for J := 1 to ComputerEntries do  Computers.Add(Copy(EnumComputerBuffer[J].lpRemoteName, 3, Length(EnumComputerBuffer[J].lpRemoteName) - 2));  WNetCloseEnum(EnumComputerHandle);  end;  end;  end;  WNetCloseEnum(EnumWorkGroupHandle);  end;    if EnumError = ERROR_NO_MORE_ITEMS then  EnumError := NO_ERROR;  Result := EnumError;    end;    initialization    Computers := TStringList.Create;    finalization    Computers.Free;    end. 

解决方案 »

  1.   

    谢谢 johnsonrao(johnson)  先,我先试试可以用不哈~~~~
      

  2.   

    恩?这得到的是计算机名称还是网卡的Mac地址哦?编译是可以通过啦,但是调用怎么调用哦??顺便说一句,局域网内所有计算机的IP地址及计算机名称我都找到资料了的,但是
    这个网卡的物理地址(Mac地址)还不能得到~~~~
    因为要用到远程启动电脑,所以得先知道局域网内所有计算机网卡的Mac地址。还有大虾来吗?谢谢~~~~~~~~~~
      

  3.   

    在局域网中通过计算机名称获得其IP地址:
      uses
        ....
        winsock;
      type
        TForm1=Class(TForm)
        Button1:TButton;
        Edit1:TEdit;
        Edit2:TEdit;
      .......
      .......
      procedure TForm1.Button1Click(Sender:TOBject);
      var
        WSAData:TWSAData;
        HostEnt:PHostEnt;
        sComputerName:String;
      begin
        sComputerName:=Edit1.text;
        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^[i]),Byte(h_addr^[2]),Byte(h_addr^[3])]);
          end;
         WSACleanup;
         Edit2.text:=sIP;
    end;
      

  4.   

    to LMale(嘿嘿!~*_*^):你那是得到IP地址哈~~我是要得到网卡的Mac地址
      

  5.   

    http://vcl.vclxx.org/DELPHIGB/AAAT1026.HTM上有个如何取得 Ethernet MAC 地址范例nb.zip
      

  6.   

    to cornermoss,刚才没有看清就写了,呵呵,查了会书发现用Dos Shell命令的Nbstat能够实现,我试了一下,没太大问题,不过好象挺费时的:
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls;type
      TForm1 = class(TForm)
        Label1: TLabel;
        Label2: TLabel;
        Edit1: TEdit;
        Edit2: TEdit;
        Memo1: TMemo;
        Label3: TLabel;
        Button1: TButton;
        RadioGroup1: TRadioGroup;
        RadioButton1: TRadioButton;
        RadioButton2: TRadioButton;
        RadioButton3: TRadioButton;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      temp:string;
    implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    begin
     Memo1.Lines.Clear;
     Temp:='c:\Nbtstat.txt';
     
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      Command:String;
    begin
      Memo1.Lines.Clear;
      if FileExists(Temp) then
        DeleteFile(Temp);
      case RadioGroup1.itemindex of
        0: Command:='Command.com /c nbtstat '+ '-a' +Edit1.Text +' > '+ Temp;
        1: Command:='Command.com /c nbtstat '+ '-A' +Edit2.Text +'> '+Temp;
        2: Command:='Command.com /c nbtstat ' + ' -n > '+Temp;
      end;
      WinExec(Pchar(Command),SW_HIDE);
      while not FileExists(Temp) do
       Sleep(3000);//此处是避免输入的IP地址不合法或者相印的计算机没有上             //网。
      try
        Memo1.Lines.LoadFromFile(Temp);
      except  end;end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
        if FileExists(Temp) then
          DeleteFile(Temp);
    end;end.
      

  7.   

    to LMale(嘿嘿!~*_*^):先谢谢你啦,不过你的程序可真费时的,每次都程序没
    响应~~~再说,你那取得的是一大段文本呀~~如果我单取其中的网卡地址,不是还
    要费事地对文本进行操作了??顺便问一句呀~~这两天怎么连不上大富翁了哦~~~再这里可真人气不旺了哦:((还有大虾来吗??继续在线等候中……嫌分少的话我再加呀~~~~~
      

  8.   

    nbtstat -a 可以由其他计算机的名字得到其网卡Mac地址,
    在网上找了很多资料,都是对本机网卡的求法,及求得局域网内其他电脑的计算机名和IP地址,现在我是要求得其他电脑的网卡MAc地址。或者,高手指教一下,怎样读出下面字段中“MAC Address = ”后的字串呢?谢谢
           NetBIOS Remote Machine Name Table   Name               Type         Status
    -------------------------------------------
    ZXD            <00>  UNIQUE      Registered
    SZBONKA        <00>  GROUP       Registered
    ZXD            <03>  UNIQUE      Registered
    ZXD            <20>  UNIQUE      Registered
    SZBONKA        <1E>  GROUP       Registered
    HML            <03>  UNIQUE      RegisteredMAC Address = 00-50-BA-64-8B-1B