How to get the MAC address of a network card using Delphi?

Depending on the name - can someone help me?

+4
source share
4 answers

Get the JEDI conversion of the Microsoft IP Assistant library from the Project JEDI API Header Library - IPHlpAPI.zip file. Unzip the files, you need IpTypes.pas and IpHlpApi.pas. Then you can use something like this:

procedure TForm1.Button1Click(Sender: TObject); var NumInterfaces: Cardinal; AdapterInfo: array of TIpAdapterInfo; OutBufLen: ULONG; i: integer; begin GetNumberOfInterfaces(NumInterfaces); SetLength(AdapterInfo, NumInterfaces); OutBufLen := NumInterfaces * SizeOf(TIpAdapterInfo); GetAdaptersInfo(@AdapterInfo[0], OutBufLen); Memo1.Lines.Clear; for i := 0 to NumInterfaces - 1 do begin Memo1.Lines.Add(Format('%.2x:%.2x:%.2x:%.2x:%.2x:%.2x', [AdapterInfo[i].Address[0], AdapterInfo[i].Address[1], AdapterInfo[i].Address[2], AdapterInfo[i].Address[3], AdapterInfo[i].Address[4], AdapterInfo[i].Address[5]])); end; end; 

(All error handling is omitted; you must add it, of course.)

+16
source

The GetAdaptersAddresses function is the preferred way to get adapter information since 2001 on Windows XP.

The adapter information is returned in the IP_ADAPTER_ADDRESSES structure with the AdapterAddresses parameter.

The GetAdaptersAddresses function can receive information for IPv4 and IPv6 addresses .

The recommended method for calling the GetAdaptersAddresses function is to pre-allocate the 15 KB working buffer that the AdapterAddresses parameter AdapterAddresses . On typical computers, this greatly reduces the likelihood that the GetAdaptersAddresses function returns ERROR_BUFFER_OVERFLOW , which will require calling the GetAdaptersAddresses function several times.


 procedure TForm1.Button1Click(Sender: TObject); const AF_UNSPEC = 0; GAA_FLAG_INCLUDE_ALL_INTERFACES = $100; WORKING_BUFFER_SIZE = 15000; MAX_TRIES = 3; var pAddresses, pCurrAddresses: PIpAdapterAddresses; dwRetVal, outBufLen: Cardinal; i: Integer; macAddress: string; begin Memo1.Lines.Clear; outBufLen := WORKING_BUFFER_SIZE; pAddresses := nil; i := 0; repeat if Assigned(pAddresses) then FreeMem(pAddresses); GetMem(pAddresses, outBufLen); if not Assigned(pAddresses) then raise Exception.Create('Memory allocation failed for IP_ADAPTER_ADDRESSES struct'); dwRetVal := GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_INCLUDE_ALL_INTERFACES, nil, pAddresses, @outBufLen); Inc(i); until (dwRetVal <> ERROR_BUFFER_OVERFLOW) or (i = MAX_TRIES); try if NO_ERROR <> dwRetVal then begin if ERROR_NO_DATA = dwRetVal then begin MessageDlg('No addresses were found for the requested parameters', mtInformation, [mbOK], 0); Exit; end else raise Exception.Create(SysErrorMessage(dwRetVal)); end; pCurrAddresses := pAddresses; while Assigned(pCurrAddresses) do begin if pCurrAddresses^.PhysicalAddressLength > 0 then begin Memo1.Lines.Add(pCurrAddresses^.FriendlyName); macAddress := ''; for i := 0 to pCurrAddresses^.PhysicalAddressLength - 1 do begin if i > 0 then macAddress := macAddress + ':'; macAddress := macAddress + Format('%.2X', [pCurrAddresses^.PhysicalAddress[i]]); end; Memo1.Lines.Add(macAddress); Memo1.Lines.Add(''); end; pCurrAddresses := pCurrAddresses^.Next; end; finally if Assigned(pAddresses) then FreeMem(pAddresses); end; end; 
+2
source

if you have Indy, you can use MB30 (the code is taken from https://www.swissdelphicenter.ch/en/showcode.php?id=651 )

 uses classes, sysUtils, NB30; function GetMACAdress: TStringList; var NCB: PNCB; Adapter: PAdapterStatus; URetCode: PChar; RetCode: char; I: integer; Lenum: PlanaEnum; _SystemID: string; TMPSTR: string; begin Result := TStringList.create(); _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); try 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); if (_SystemID <> '00-00-00-00-00-00') and (Result.IndexOf(_SystemID)=-1) then Result.add(_SystemId); end; Inc(i); until (I >= Ord(Lenum.Length)); finally FreeMem(NCB); FreeMem(Adapter); FreeMem(Lenum); end; end; 
0
source

Knowing almost nothing about delphi, about starting% system32% \ ipconfig.exe / all and parsing the output?

-4
source

All Articles