zoukankan      html  css  js  c++  java
  • 取MAC地址 (含多网卡),最好的方法,支持Vista,Win7

    取MAC地址 (含多网卡),最好的方法,支持Vista,Win7

    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    WinSock, StdCtrls;

    Const
    MAX_HOSTNAME_LEN = 128; { from IPTYPES.H }
    MAX_DOMAIN_NAME_LEN = 128;
    MAX_SCOPE_ID_LEN = 256;
    MAX_ADAPTER_NAME_LENGTH = 256;
    MAX_ADAPTER_DESCRIPTION_LENGTH = 128;
    MAX_ADAPTER_ADDRESS_LENGTH = 8;

    Type
    TIPAddressString = Array[0..4*4-1] of Char;

    PIPAddrString = ^TIPAddrString;
    TIPAddrString = Record
    Next : PIPAddrString;
    IPAddress : TIPAddressString;
    IPMask : TIPAddressString;
    Context : Integer;
    End;

    PFixedInfo = ^TFixedInfo;
    TFixedInfo = Record { FIXED_INFO }
    HostName : Array[0..MAX_HOSTNAME_LEN+3] of Char;
    DomainName : Array[0..MAX_DOMAIN_NAME_LEN+3] of Char;
    CurrentDNSServer : PIPAddrString;
    DNSServerList : TIPAddrString;
    NodeType : Integer;
    ScopeId : Array[0..MAX_SCOPE_ID_LEN+3] of Char;
    EnableRouting : Integer;
    EnableProxy : Integer;
    EnableDNS : Integer;
    End;

    PIPAdapterInfo = ^TIPAdapterInfo;
    TIPAdapterInfo = Record { IP_ADAPTER_INFO }
    Next : PIPAdapterInfo;
    ComboIndex : Integer;
    AdapterName : Array[0..MAX_ADAPTER_NAME_LENGTH+3] of Char;
    Description : Array[0..MAX_ADAPTER_DESCRIPTION_LENGTH+3] of Char;
    AddressLength : Integer;
    Address : Array[1..MAX_ADAPTER_ADDRESS_LENGTH] of Byte;
    Index : Integer;
    _Type : Integer;
    DHCPEnabled : Integer;
    CurrentIPAddress : PIPAddrString;
    IPAddressList : TIPAddrString;
    GatewayList : TIPAddrString;
    DHCPServer : TIPAddrString;
    HaveWINS : Bool;
    PrimaryWINSServer : TIPAddrString;
    SecondaryWINSServer : TIPAddrString;
    LeaseObtained : Integer;
    LeaseExpires : Integer;
    End;

    type
    TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    private
    { Private declarations }
    procedure GetAdapterInformation;
    public
    { Public declarations }
    end;

    var
    Form1: TForm1;

    Function sendarp(ipaddr:ulong;
    temp:dword;
    ulmacaddr:pointer;
    ulmacaddrleng:pointer) : DWord; StdCall;

    implementation

    {$R *.dfm}

    Function sendarp; External 'Iphlpapi.dll' Name 'SendARP';
    Function GetAdaptersInfo(AI : PIPAdapterInfo; Var BufLen : Integer) : Integer;
    StdCall; External 'iphlpapi.dll' Name 'GetAdaptersInfo';

    procedure TForm1.GetAdapterInformation;
    Var
    AI,Work : PIPAdapterInfo;
    Size : Integer;
    Res : Integer;
    I : Integer;

    Function MACToStr(ByteArr : PByte; Len : Integer) : String;
    Begin
    Result := '';
    While (Len > 0) do Begin
    Result := Result+IntToHex(ByteArr^,2)+'-';
    ByteArr := Pointer(Integer(ByteArr)+SizeOf(Byte));
    Dec(Len);
    End;
    SetLength(Result,Length(Result)-1); { remove last dash }
    End;

    Function GetAddrString(Addr : PIPAddrString) : String;
    Begin
    Result := '';
    While (Addr <> nil) do Begin
    Result := Result+'A: '+Addr^.IPAddress+' M: '+Addr^.IPMask+#13;
    Addr := Addr^.Next;
    End;
    End;

    Function TimeTToDateTimeStr(TimeT : Integer) : String;
    Const UnixDateDelta = 25569; { days between 12/31/1899 and 1/1/1970 }
    Var
    DT : TDateTime;
    TZ : TTimeZoneInformation;
    Res : DWord;

    Begin
    If (TimeT = 0) Then Result := ''
    Else Begin
    { Unix TIME_T is secs since 1/1/1970 }
    DT := UnixDateDelta+(TimeT / (24*60*60)); { in UTC }
    { calculate bias }
    Res := GetTimeZoneInformation(TZ);
    If (Res = TIME_ZONE_ID_INVALID) Then RaiseLastWin32Error;
    If (Res = TIME_ZONE_ID_STANDARD) Then Begin
    DT := DT-((TZ.Bias+TZ.StandardBias) / (24*60));
    Result := DateTimeToStr(DT)+' '+WideCharToString(TZ.StandardName);
    End
    Else Begin { daylight saving time }
    DT := DT-((TZ.Bias+TZ.DaylightBias) / (24*60));
    Result := DateTimeToStr(DT)+' '+WideCharToString(TZ.DaylightName);
    End;
    End;
    End;

    begin
    Memo1.Lines.Clear;
    Size := 5120;
    GetMem(AI,Size);
    Res := GetAdaptersInfo(AI,Size);
    If (Res <> ERROR_SUCCESS) Then Begin
    SetLastError(Res);
    RaiseLastWin32Error;
    End;
    With Memo1,Lines do Begin
    Work := AI;
    I := 1;
    Repeat
    Add('');
    Add('Adapter ' + IntToStr(I));
    Add(' ComboIndex: '+IntToStr(Work^.ComboIndex));
    Add(' Adapter name: '+Work^.AdapterName);
    Add(' Description: '+Work^.Description);
    Add(' Adapter address: '+MACToStr(@Work^.Address,Work^.AddressLength));
    Add(' Index: '+IntToStr(Work^.Index));
    Add(' Type: '+IntToStr(Work^._Type));
    Add(' DHCP: '+IntToStr(Work^.DHCPEnabled));
    Add(' Current IP: '+GetAddrString(Work^.CurrentIPAddress));
    Add(' IP addresses: '+GetAddrString(@Work^.IPAddressList));
    Add(' Gateways: '+GetAddrString(@Work^.GatewayList));
    Add(' DHCP servers: '+GetAddrString(@Work^.DHCPServer));
    Add(' Has WINS: '+IntToStr(Integer(Work^.HaveWINS)));
    Add(' Primary WINS: '+GetAddrString(@Work^.PrimaryWINSServer));
    Add(' Secondary WINS: '+GetAddrString(@Work^.SecondaryWINSServer));
    Add(' Lease obtained: '+TimeTToDateTimeStr(Work^.LeaseObtained));
    Add(' Lease expires: '+TimeTToDateTimeStr(Work^.LeaseExpires));
    Inc(I);
    Work := Work^.Next;
    Until (Work = nil);
    End;
    FreeMem(AI);
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    GetAdapterInformation;
    end;

    end.

  • 相关阅读:
    有哪些带汉字的 LOGO 或者图标设计得很出色?
    从初级晋级高级UI设计师学习路线+全套视频
    UI常见面试题-整体素养篇
    PS精修电影胶片调色特效[附素材及方法]
    全链路UI、UE设计学习路线+视频教程完整版
    网页设计之栅格系统及应用
    移动端APP产品设计结构及专业术语
    九十分钟极速入门Linux——Linux Guide for Developments 学习笔记
    PAT树_层序遍历叶节点、中序建树后序输出、AVL树的根、二叉树路径存在性判定、奇妙的完全二叉搜索树、最小堆路径、文件路由
    数据结构第三部分:树与树的表示、二叉树及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树、集合及其运算
  • 原文地址:https://www.cnblogs.com/honeynm/p/4314428.html
Copyright © 2011-2022 走看看