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.

  • 相关阅读:
    【PL/SQL练习】显式游标
    【PL/SQL练习】控制结构
    【PL/SQL练习】游标cursor :oracle 在执行sql语句时,为sql语句所分配的一个私有的内存区域
    【PL/SQL练习】DML语句的处理(可以处理多行数据)
    【PL/SQL练习】复合变量: 可以一次传递多个值到变量中。
    【PL/SQL练习】基本的PL/SQL语句
    【小错误】监听
    【考试】用户管理
    【考试】简单的sql语句
    织梦自定义表单地区联动类型不可用的解决办法
  • 原文地址:https://www.cnblogs.com/honeynm/p/4314428.html
Copyright © 2011-2022 走看看