[Delphi]获取机器的Mac地址

2017-07-06 19:47:26来源:CSDN作者:yueyun889人点击

从网上搜罗来的一个函数,非常实用,贴出来带大家分享,也供自己查看。

//返回值是主机AServerName的MAC地址//AServerName参数的格式为// 或者 ServerName//参数ServerName为空时返回本机的MAC地址//MAC地址以XX-XX-XX-XX-XX-XX的格式返回//function GetMacAddress2(const AServerName : string='') : string;type     TNetTransportEnum = function(pszServer : PWideChar;                                  Level : DWORD;                                  var pbBuffer : pointer;                                  PrefMaxLen : LongInt;                                  var EntriesRead : DWORD;                                  var TotalEntries : DWORD;                                  var ResumeHandle : DWORD) : DWORD; stdcall;     TNetApiBufferFree = function(Buffer : pointer) : DWORD; stdcall;     PTransportInfo = ^TTransportInfo;     TTransportInfo = record                       quality_of_service : DWORD;                       number_of_vcs : DWORD;                       transport_name : PWChar;                       transport_address : PWChar;                       wan_ish : boolean;                     end;var E,ResumeHandle,    EntriesRead,    TotalEntries : DWORD;    FLibHandle : THandle;    sMachineName,    sMacAddr,    Retvar : string;    pBuffer : pointer;    pInfo : PTransportInfo;    FNetTransportEnum : TNetTransportEnum;    FNetApiBufferFree : TNetApiBufferFree;    pszServer : array[0..128] of WideChar;    i,ii,iIdx : integer;begin  sMachineName := trim(AServerName);  Retvar := '00-00-00-00-00-00';  // Add leading // if missing  if (sMachineName <> '') and (length(sMachineName) >= 2) then begin    if copy(sMachineName,1,2) <> '//' then      sMachineName := '//' + sMachineName  end;  // Setup and load from DLL  pBuffer := nil;  ResumeHandle := 0;  FLibHandle := LoadLibrary('NETAPI32.DLL');  // Execute the external function  if FLibHandle <> 0 then begin    @FNetTransportEnum := GetProcAddress(FLibHandle,'NetWkstaTransportEnum');    @FNetApiBufferFree := GetProcAddress(FLibHandle,'NetApiBufferFree');    E := FNetTransportEnum(StringToWideChar(sMachineName,pszServer,129),0,                           pBuffer,-1,EntriesRead,TotalEntries,Resumehandle);    if E = 0 then begin      pInfo := pBuffer;      // Enumerate all protocols – look for TCPIP      for i := 1 to EntriesRead do begin        if pos('TCPIP',UpperCase(pInfo^.transport_name)) <> 0 then begin          // Got It – now format result xx-xx-xx-xx-xx-xx          iIdx := 1;          sMacAddr := pInfo^.transport_address;          for ii := 1 to 12 do begin            Retvar[iIdx] := sMacAddr[ii];            inc(iIdx);            if iIdx in [3,6,9,12,15] then inc(iIdx);          end;        end;        inc(pInfo);      end;      if pBuffer <> nil then FNetApiBufferFree(pBuffer);    end;    try      FreeLibrary(FLibHandle);    except      // 错误处理    end;  end;  result:=Retvar;end;


最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台