delphi获取机器的Mac地址  
官方Delphi 学习QQ群: 682628230(三千人)\n
频道

delphi获取机器的Mac地址


//返回值是主机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;  

推荐分享
图文皆来源于网络,内容仅做公益性分享,版权归原作者所有,如有侵权请告知删除!
 

Copyright © 2014 DelphiW.com 开发 源码 文档 技巧 All Rights Reserved
晋ICP备14006235号-8 晋公网安备 14108102000087号

执行时间: 0.047652959823608 seconds