下面的函數以'XX-XX-XX-XX-XX-XX' 的格式返回遠程或本地機器的MAC地址。
Function to return the MAC address of a remote or local machine in the format 'XX-XX-XX-XX-XX-XX'
返回的MAC地址是一個能用在多個方面的唯一標識。使用方法:
ShowMessage(GetMacAddress('//MHEYDON'); 
輸出'00-02-08-E7-99-6B'
// ====================================================================== 
//返回值是主機AServerName的MAC地址
//AServerName參數的格式為'//ServerName' 或者 'ServerName' 
//參數ServerName為空時返回本機的MAC地址 
//MAC地址以'XX-XX-XX-XX-XX-XX'的格式返回
// ====================================================================== 
function GetMacAddress(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;
新聞熱點
疑難解答