RT

解决方案 »

  1.   


    function IpToMac(ip: string): string;
    var
      destIp, macLen, r: Cardinal;
      macAddr: array[0..5] of Byte;
      ansiIp: AnsiString;
    begin
      ansiIp := ip;
      destIp := inet_addr(PAnsiChar(ansiIp));
      macLen := Length(macAddr);
      r := SendARP(destIp, 0, @macAddr, macLen);
      if r = 0 then
        Result := Format('%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x',
                      [macAddr[0], macAddr[1], macAddr[2], macAddr[3], macAddr[4], macAddr[5]])
      else
        Result := 'ERROR';
    end;
    在XE下需要winsock2和IpHlpApi两个单元
      

  2.   

    // ======================================================================
    //返回值是主机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;
        TTransportInfo = record
                          quality_of_service: DWord;
                          number_of_vcs: DWORD;
                          transport_name: PWChar;
                          transport_address: PWChar;
                          wan_ish: boolean;
                        end;
        TNetApiBufferFree = function(Buffer: pointer): DWORD; stdcall;
        PTransportInfo = ^TTransportInfo;
    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;