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 ?C look for TCPIP  
      for i := 1 to EntriesRead do begin  
        if pos('TCPIP',UpperCase(pInfo^.transport_name)) <> 0 then begin  
          // Got It ?C 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;  

相关阅读 >>

Delphi excel操作,写了个adodataset转excel的函数

Delphi 自带gif控件的动画图片加载和播放

Delphi 防止程序重复执行(多种方法)

Delphi fmx 绘制非常精确的 时分秒针

secsperday:一天共有多少秒

Delphi tstrings 随机打乱

Delphi 从资源文件中加载字符

Delphi 10.4.1的编译器bug终于修正了!

Delphi截取技巧 lastdelimiter

Delphi 判断是否为二进制文件

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...