delphi 获取网卡信息(支持多网卡)

  unit LGetAdapterInfo;

interface

uses

Windows, SysUtils, Classes;

const

MAX_HOSTNAME_LEN = ; { from IPTYPES.H }

MAX_DOMAIN_NAME_LEN = ;

MAX_SCOPE_ID_LEN = ;

MAX_ADAPTER_NAME_LENGTH = ;

MAX_ADAPTER_DESCRIPTION_LENGTH = ;

MAX_ADAPTER_ADDRESS_LENGTH = ;

type

TIPAddressString = array[.. *  - ] of AnsiChar;

PIPAddrString = ^TIPAddrString;

TIPAddrString = record

Next: PIPAddrString;

IPAddress: TIPAddressString;

IPMask: TIPAddressString;

Context: Integer;

end;

PFixedInfo = ^TFixedInfo;

TFixedInfo = record { FIXED_INFO }

HostName: array[..MAX_HOSTNAME_LEN + ] of AnsiChar;

DomainName: array[..MAX_DOMAIN_NAME_LEN + ] of AnsiChar;

CurrentDNSServer: PIPAddrString;

DNSServerList: TIPAddrString;

NodeType: Integer;

ScopeId: array[..MAX_SCOPE_ID_LEN + ] of AnsiChar;

EnableRouting: Integer;

EnableProxy: Integer;

EnableDNS: Integer;

end;

PIPAdapterInfo = ^TIPAdapterInfo;

TIPAdapterInfo = record { IP_ADAPTER_INFO }

Next: PIPAdapterInfo;

ComboIndex: Integer;

AdapterName: array[..MAX_ADAPTER_NAME_LENGTH + ] of AnsiChar;

Description: array[..MAX_ADAPTER_DESCRIPTION_LENGTH + ] of AnsiChar;

AddressLength: Integer;

Address: array[..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;

TAdapterInfo = class(TObject)

Index: Integer; //序号

AdapterName: string; //网卡名

IPAddress: string; //IP地址

Subnetmask: string; //子网掩码

Gateway: string; //网关

MacAddress: string; //MAC地址

DHCP: Boolean; //是否是自动分配

DHCPServer: string; //DHCP服务器地址

end;

function SendARP(ipaddr: ulong; temp: dword; ulmacaddr: pointer;

ulmacaddrleng: pointer): DWord; StdCall;

function GetAdapterInfo: TList;

var

AI, Work: PIPAdapterInfo;

Size: Integer;

Res: Integer;

I: Integer;

implementation

function SendARP; external 'Iphlpapi.dll' Name 'SendARP';

function GetAdaptersInfo(AI: PIPAdapterInfo; var BufLen: Integer): Integer;

stdcall; external 'iphlpapi.dll' Name 'GetAdaptersInfo';

function MACToStr(ByteArr: PByte; Len: Integer): string;

begin

Result := '';

while (Len > ) do

begin

Result := Result + IntToHex(ByteArr^, ) + '-';

ByteArr := Pointer(Integer(ByteArr) + SizeOf(Byte));

Dec(Len);

end;

SetLength(Result, Length(Result) - ); { remove last dash }

end;

function GetAddrString(Addr: PIPAddrString): string;

begin

Result := '';

while (Addr <> nil) do

begin

Result := Result + 'A: ' + Addr^.IPAddress + ' M: ' + Addr^.IPMask + #;

Addr := Addr^.Next;

end;

end;

function TimeTToDateTimeStr(TimeT: Integer): string;

const

UnixDateDelta = ; { days between12/31/1899and 1/1/1970 }

var

DT: TDateTime;

TZ: TTimeZoneInformation;

Res: DWord;

begin

if (TimeT = ) then

Result := ''

else

begin

{ Unix TIME_T is secs since1/1/1970}

DT := UnixDateDelta + (TimeT / ( *  * )); { 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) / ( * ));

Result := DateTimeToStr(DT) + ' ' + WideCharToString(TZ.StandardName);

end

else

begin { daylight saving time }

DT := DT - ((TZ.Bias + TZ.DaylightBias) / ( * ));

Result := DateTimeToStr(DT) + ' ' + WideCharToString(TZ.DaylightName);

end;

end;

end;

function GetAdapterInfo: TList;

var

AAdapterInfo: TAdapterInfo;

AAdapterInfos: TList;

begin

Size := ;

GetMem(AI, Size);

Res := GetAdaptersInfo(AI, Size);

if (Res <> ERROR_SUCCESS) then

begin

SetLastError(Res);

RaiseLastWin32Error;

end;

Work := AI;

I := ;

AAdapterInfos := TList.Create;

repeat

AAdapterInfo := TAdapterInfo.Create;

AAdapterInfo.Index := I;

AAdapterInfo.AdapterName := Work^.Description;

AAdapterInfo.IPAddress := Copy(GetAddrString(@Work^.IPAddressList),

Pos('A: ', GetAddrString(@Work^.IPAddressList)) + , Pos(' M: ',

GetAddrString(@Work^.IPAddressList)) - Pos('A: ',

GetAddrString(@Work^.IPAddressList)) - );

AAdapterInfo.Subnetmask := Copy(GetAddrString(@Work^.IPAddressList),

Pos(' M: ', GetAddrString(@Work^.IPAddressList)) + ,

length(GetAddrString(@Work^.IPAddressList)));

AAdapterInfo.Gateway := Copy(GetAddrString(@Work^.GatewayList), Pos('A: ',

GetAddrString(@Work^.GatewayList)) + , Pos(' M: ',

GetAddrString(@Work^.GatewayList)) - Pos('A: ',

GetAddrString(@Work^.GatewayList)) - );

AAdapterInfo.MacAddress := MACToStr(@Work^.Address, Work^.AddressLength);

AAdapterInfo.DHCP := Work^.DHCPEnabled > ;

AAdapterInfo.DHCPServer := Copy(GetAddrString(@Work^.DHCPServer), Pos('A: ',

GetAddrString(@Work^.DHCPServer)) + , Pos(' M: ',

GetAddrString(@Work^.DHCPServer)) - Pos('A: ',

GetAddrString(@Work^.DHCPServer)) - );

AAdapterInfos.Add(AAdapterInfo);

Inc(I);

Work := Work^.Next;

until (Work = nil);

Result :=AAdapterInfos;

FreeMem(AI);

end;

end.

使用方法 :

procedure TForm1.Button2Click(Sender: TObject);

var

aa:TList;

i :Integer;

begin

aa :=GetAdapterInfo;

for i :=  to aa.Count -  do

begin

Memo1.Lines.Add(TAdapterInfo(aa.Items[i]).AdapterName);

end;

end;

delphi 获取网卡信息(支持多网卡)的更多相关文章

  1. delphi 获取硬盘序列号、cpu号、bios号、网卡号

    delphi 获取硬盘 序列号 function GetIdeNum: String; type TSrbIoControl = packed record HeaderLength : ULONG; ...

  2. 基于WMI获取本机真实网卡物理地址和IP地址

    using System; using System.Collections.Generic; using System.Management; using System.Runtime.Intero ...

  3. Delphi获取文件名、文件名不带扩展名、文件名的方法;delphi 获取文件所在路径

    取文件名 ExtractFileName(FileName); 取文件扩展名: ExtractFileExt(filename); 取文件名,不带扩展名: 方法一:   Function Extrac ...

  4. Java API研究:获取本地环境所有网卡及每个网卡的所有网络配置

    一个网卡(不太标准,应该叫做一个网络接口,一个网卡是可以拥有多个网络接口的,如SoftAP)拥有一套网络配置:ip地址,子网掩码,网关,dns等等. 自java 1.6开始,提供了访问网络配置的一些接 ...

  5. Windows Azure Virtual Machine (24) Azure VM支持多网卡功能

    <Windows Azure Platform 系列文章目录> Update 2016-03-30 一个VM的多张网卡可以在一个VNet的同一个Subnet子网下,笔者亲自测试过了. 如果 ...

  6. Delphi 获取进程路径及命令行参数

    Delphi 获取进程路径及命令行参数, 但有的进程获取时会报错,不知为啥 type PVOID64 = UINT64; _UNICODE_STRING = packed record Length ...

  7. Delphi 获取当前鼠标下的控件内容

    Delphi 获取当前鼠标下的控件内容 主要函数: GetCursorPos://获取鼠标的位置 WindowFromPoint://获取制定point下的handle GetClassName:// ...

  8. 4.移植uboot-使uboot支持DM9000网卡

    在上一章,使uboot能够支持nor.nand 本节继续修改让uboot支持DM9000C网卡,便可以通过网络来传输文件 首先uboot已带有dm9000网卡的驱动,位于drivers/net/下的d ...

  9. Delphi获取本机的MAC地址

    Delphi获取本机的MAC地址: uses   NB30; function GetAdaPterInfo(lana: Char): string; var   Adapter: TAdapterS ...

随机推荐

  1. 【Visual Studio】控制台程序运行时一闪而过

    问题:写一个C#控制台程序,运行时控制台一闪而过.程序结束.无法看清控制台输出的结果. 办法: 方法一二三都有人写过百度经验了:怎么解决VS运行程序一闪而过 其实还有一种办法,就是把控制台程序改为Wi ...

  2. 纯css实现进度条效果

    去年7月份做一个公司商城的微信页面(微信用的chrome内核)需要写一个提示返现进度的进度条效果. 一个完整的进度条效果其实可以拆分一下: 一段背景: 一小段的静态的斜纹进度条: 斜纹进度条用线性渐变 ...

  3. 一站式学习Wireshark(二):应用Wireshark观察基本网络协议

    TCP: TCP/IP通过三次握手建立一个连接.这一过程中的三种报文是:SYN,SYN/ACK,ACK. 第一步是找到PC发送到网络服务器的第一个SYN报文,这标识了TCP三次握手的开始. 如果你找不 ...

  4. Drupal的目录结构

    ①.includes 文件夹 存放Drupal程序头文件. Drupal的一些函数和变量的定义,均可在此文件夹下的文件中找到.这 些文件都是以.inc结尾的. ②.misc文件夹 Drupal所用的其 ...

  5. Testng 的数据源 驱动測试 代码与配置

    JUnit中有讲述使用注解的方式进行数据源读取进行自己主动循环測试的方法,在TestNG中也提供了对应的方法 public class TestngDataProvider { /** * 数组内的每 ...

  6. 为iframe添加鼠标事件

    1.关于iframe标签 使用iframe元素会创建包含另外一个文档的内联框架(即行内框架).所以我们可以使用iframe标签,在一个页面嵌入另一个页面.通过指定iframe的src为另一个页面的路径 ...

  7. 在Linux环境下mysql的root密码忘记解决方法

    MySQL密码的恢复方法之一 .首先确认服务器出于安全的状态,也就是没有人能够任意地连接MySQL数据库. 因为在重新设置MySQL的root密码的期间,MySQL数据库完全出于没有密码保护的 状态下 ...

  8. Jquery与.net MVC结合,通过Ajax

    在工作中做了这么一个东西. Html端: @using Test.fh.Project.Storefront.ViewModels @using Test.fh.Project.Storefront. ...

  9. 如何退出Activity?如何安全退出已调用多个Activity的Application?

    对于单一Activity的应用来说,退出很简单,直接finish()即可. 1.抛异常强制退出: 该方法通过抛异常,使程序ForceClose. 验证可以,但是,需要解决的问题是,如何使程序结束掉,而 ...

  10. CentOS简单命令学习:date cal bc

    简单的shell指令: 1.日期的格式化显示: 2.日历的显示: 3.bc计算器: 使用Tab指令自动补全: