function GetMacAddresses(const Machine: string; const Addresses: TStrings): Integer; 
var 
NCB: TNCB; 
Enum: TLanaEnum; 
I, L, NameLen: Integer; 
Adapter: ASTAT; 
MachineName: string; 
begin 
Result := -1; 
Addresses.Clear; 
MachineName := UpperCase(Machine); 
if MachineName = '' then 
MachineName := '*'; 
NameLen := Length(MachineName); 
L := NCBNAMSZ - NameLen; 
if L > 0 then 
begin 
SetLength(MachineName, NCBNAMSZ); 
FillChar(MachineName[NameLen + 1], L, ' '); 
end; 
FillChar(NCB, SizeOf(NCB), #0); 
NCB.ncb_command := NCBENUM; 
NCB.ncb_buffer := Pointer(@Enum); 
NCB.ncb_length := SizeOf(Enum); 
if NetBios(@NCB) = NRC_GOODRET then 
begin 
Result := Enum.Length; 
for I := 0 to Ord(Enum.Length) - 1 do 
begin 
FillChar(NCB, SizeOf(NCB), #0); 
NCB.ncb_command := NCBRESET; 
NCB.ncb_lana_num := Enum.lana[I]; 
if NetBios(@NCB) = NRC_GOODRET then 
begin 
FillChar(NCB, SizeOf(NCB), #0); 
NCB.ncb_command := NCBASTAT; 
NCB.ncb_lana_num := Enum.lana[I]; 
Move(MachineName[1], NCB.ncb_callname, SizeOf(NCB.ncb_callname)); 
NCB.ncb_buffer := PChar(@Adapter); 
NCB.ncb_length := SizeOf(Adapter); 
if NetBios(@NCB) = NRC_GOODRET then 
Addresses.Add(AdapterToString(Adapter.adapt)); 
end; 
end; 
end; 
end; 
************************
//获取网卡地址,使用netbios 3.0调用 uses nb30.pas shipped with delphi 4.0
       function _NetCardAddress : String ;
       var
         NCB : TNCB ;               // Netbios control block
         ADAPTER : TADAPTERSTATUS ; // Netbios adapter status
         LANAENUM : TLANAENUM ;     // Netbios lana
         intIdx : Integer ;         // Temporary work value
         CRC : Char ;               // Netbios return code
         strTemp : String ;         // Temporary string
       begin
         Result := '' ;
         try
           ZeroMemory(@NCB,SizeOf(NCB)) ;     // Zero control blocl
           NCB.ncb_command := Chr(NCBENUM) ;  // Issue enum command
           cRC := NetBios(@NCB) ;
            if Ord(cRC)>0 then begin
              result:=_NBReturnMSG(crc);
              exit ;
           end;           NCB.ncb_buffer := @LANAENUM ;      // Reissue enum command
           NCB.ncb_length := SizeOf(LANAENUM);
           cRC := NetBios(@NCB) ;
           if Ord(cRC)>0 then begin
              result:=_NBReturnMSG(crc);
              exit ;
           end;
           ZeroMemory(@NCB,SizeOf(NCB)) ;     // Reset adapter
           NCB.ncb_command := Chr(NCBRESET) ;
           NCB.ncb_lana_num := LANAENUM.lana[0] ;
           cRC := NetBios(@NCB) ;
           if Ord(cRC)>0 then begin
              result:=_NBReturnMSG(crc);
              exit ;
           end;
           ZeroMemory(@NCB,SizeOf(NCB)) ;   // Get adapter address
           NCB.ncb_command := Chr(NCBASTAT) ;
           NCB.ncb_lana_num := LANAENUM.lana[0] ;
           StrPCopy(NCB.ncb_callname,'*') ;
           NCB.ncb_buffer := @ADAPTER ;
           NCB.ncb_length := SizeOf(ADAPTER) ;
           cRC := NetBios(@NCB) ;
           if Ord(cRC)>0 then begin
              result:=_NBReturnMSG(crc);
              exit ;
           end;           // Convert Netcard address it to string
           strTemp := '' ;
           for intIdx := 0 to 5 do strTemp := strTemp + _Char2Hex(ADAPTER.adapter_address[intIdx]) ;
           Result := strTemp ;
         finally
         end ;
       end ;不知你指的是在Window3.2(16Bit Delphi)还是Windows95&98&2000(32Bit Delphi),如果是32位Delphi,使用Netbios(nb30.pas),如果是16位Delphi,使用NetBiosCall(汇编语言)。

解决方案 »

  1.   

    送你一个函数
    uses NB30; function GetMACAdress: string; 
    var 
      NCB: PNCB; 
      Adapter: PAdapterStatus;   URetCode: PChar; 
      RetCode: char; 
      I: integer; 
      Lenum: PlanaEnum; 
      _SystemID: string; 
      TMPSTR: string; 
    begin 
      Result    := ''; 
      _SystemID := ''; 
      Getmem(NCB, SizeOf(TNCB)); 
      Fillchar(NCB^, SizeOf(TNCB), 0);   Getmem(Lenum, SizeOf(TLanaEnum)); 
      Fillchar(Lenum^, SizeOf(TLanaEnum), 0);   Getmem(Adapter, SizeOf(TAdapterStatus)); 
      Fillchar(Adapter^, SizeOf(TAdapterStatus), 0);   Lenum.Length    := chr(0); 
      NCB.ncb_command := chr(NCBENUM); 
      NCB.ncb_buffer  := Pointer(Lenum); 
      NCB.ncb_length  := SizeOf(Lenum); 
      RetCode         := Netbios(NCB);   i := 0; 
      repeat 
        Fillchar(NCB^, SizeOf(TNCB), 0); 
        Ncb.ncb_command  := chr(NCBRESET); 
        Ncb.ncb_lana_num := lenum.lana[I]; 
        RetCode          := Netbios(Ncb);     Fillchar(NCB^, SizeOf(TNCB), 0); 
        Ncb.ncb_command  := chr(NCBASTAT); 
        Ncb.ncb_lana_num := lenum.lana[I]; 
        // Must be 16 
        Ncb.ncb_callname := '*               ';     Ncb.ncb_buffer := Pointer(Adapter);     Ncb.ncb_length := SizeOf(TAdapterStatus); 
        RetCode        := Netbios(Ncb); 
        //---- calc _systemId from mac-address[2-5] XOR mac-address[1]... 
        if (RetCode = chr(0)) or (RetCode = chr(6)) then 
        begin 
          _SystemId := IntToHex(Ord(Adapter.adapter_address[0]), 2) + '-' + 
            IntToHex(Ord(Adapter.adapter_address[1]), 2) + '-' + 
            IntToHex(Ord(Adapter.adapter_address[2]), 2) + '-' + 
            IntToHex(Ord(Adapter.adapter_address[3]), 2) + '-' + 
            IntToHex(Ord(Adapter.adapter_address[4]), 2) + '-' + 
            IntToHex(Ord(Adapter.adapter_address[5]), 2); 
        end; 
        Inc(i); 
      until (I >= Ord(Lenum.Length)) or (_SystemID <> '00-00-00-00-00-00'); 
      FreeMem(NCB); 
      FreeMem(Adapter); 
      FreeMem(Lenum); 
      GetMacAdress := _SystemID; 
    end; //使用例子procedure TForm1.Button1Click(Sender: TObject); 
    begin 
      label1.Caption := GetMACAdress; 
    end; 
      

  2.   

    *****GetNetMacs.pas
    unit GetNetMacs;interfaceuses Windows,Classes,SysUtils;type
      PnetResourceArr = ^TNetResource;
      procedure GetServerList(List:TStrings);
      procedure GetUserList(fServer:string;List:TStrings);
    implementation
    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
      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;procedure GetUserList(fServer:string;List:TStrings);
    var NetResource : TNetResource;
        Buf : Pointer;
        Count,BufSize,Res : DWord;
        Ind : Integer;
        lphEnum : THandle;
        Temp : PNetResourceArr;
    begin
      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;
            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
                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);
      finally
        FreeMem(Buf);
      end;
    end;end.
    ********
    调用:
    function TSetup_Main.GetMacsFromName(Name:String):String;
    var Command:String;
        tempResult:String;
    begin
      Command:='Command.com /c nbtstat -a '+Name+' >temp.txt';
      WinExec(Pchar(Command),SW_HIDE);
      Sleep(1000);
      Memo1.Lines.LoadFromFile('temp.txt');
      tempResult:=Memo1.Lines[Memo1.Lines.Count-1];
      Memo1.Lines.Clear;
      if tempResult='Host not found.' then Result:='Error!'
      else
        begin
          tempResult:=Copy(tempResult,15,17);
          Result:=ReplaceText(tempResult,'-','');
        end;
    end;
    procedure TSetup_Main.GetAllStuMacs_BtnClick(Sender: TObject);
    var StuNameListN:Integer;
        LocalName:String;
        GetLineNum:Integer;
        GetLineStr:String;
    begin
      StuName_ListBox.Items.Clear;
      StuMacs_ListBox.Items.Clear;
      Application.MessageBox('依网络状况,该项操作可能耗时2-10分钟,请耐心等候!','提示',MB_OK);
      HadChangeMacs:=True;
      LocalName:=GetDomainName(LocalIPPowersock.LocalIP);
      GetUserList(NetGroup_Edit.Text,StuName_ListBox.Items);
      for StuNameListN:=StuName_ListBox.Items.Count-1 downto 0 do
        if StuName_ListBox.Items[StuNameListN]=LocalName then
          StuName_ListBox.Items.Delete(StuNameListN); //删除自己的
      Application.MessageBox('已经正确得到了所有学生机名!'+#13+#13+'下面将继续取得学生机对应的网卡地址……','提示',MB_OK);
      for StuNameListN:=0 to StuName_ListBox.Items.Count-1 do
        StuMacs_ListBox.Items[StuNameListN]:=GetMacsFromName(StuName_ListBox.Items[StuNameListN]);
      Application.MessageBox('操作成功!','提示',MB_OK);
      DeleteFile('temp.txt');
    end;可以得到相同工作组内所有联机的电脑的网卡,win98+D6通过
    ××××有看不懂的给我发短消息吧