⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit1.~pas

📁 delphi 编写的获得本机器网关IP地址的程序,枚举了可能的网卡数目
💻 ~PAS
字号:
unit Unit1;

interface

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

const
   MAX_ADAPTER_NAME_LENGTH= 256;
   MAX_ADAPTER_DESCRIPTION_LENGTH = 128;
   MAX_ADAPTER_ADDRESS_LENGTH     = 8;
   
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Label1: TLabel;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;


  Type
   TIPAddressString = Array[0..4*4-1] of Char;   //定义结构TIPADDRESSSTRING的数据类型是CHAR
   PIPAddrString = ^TIPAddrString;       //定义指针

   TIPAddrString = Record                 //TIPAddrString的结构如下:
   Next      : PIPAddrString;
   IPAddress : TIPAddressString;
   IPMask    : TIPAddressString;
   End;


 
 PIPAdapterInfo = ^TIPAdapterInfo;        //定义指针 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;

end;
var
  Form1: TForm1;
  gatewaystr:string;
  strlen:integer;

implementation

{$R *.dfm}
//得到 AdapterInfo 的信息-------------

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

//得到MAC地址----------------------------------
//将具有PBYTE类型的byetearr的长度为LEN的转换为字符串
Function MACToStr(ByteArr:PByte;Len:Integer) : String;

Begin

   Result := '';

   While (Len > 0) do
   Begin
   Result := Result+IntToHex(ByteArr^,2)+'-';
   //showmessage(result);
      ByteArr := Pointer(Integer(ByteArr)+SizeOf(Byte));
      len:=len-1;
      //showmessage(inttostr(len+1));
      //len的长度从6变化到1----------------
    End;
    SetLength(Result,Length(Result)-1); { remove last dash }

 end;
// 将 PIPAddrString 型的变量指向转换为STRING 型
Function GetAddrString(Addr:PIPAddrString) : String;
Begin
  Result := '';
   While (Addr <> nil) do
   Begin
      Result := Result+'IPAddress: '+Addr^.IPAddress+' MaskCode: '+Addr^.IPMask+#13;
     // showmessage(Result);
      Addr := Addr^.Next;
   End;
End;

procedure TForm1.Button1Click(Sender: TObject);
var
  AI,Work : PIPAdapterInfo;
  Size    : Integer;
  Res     : Integer;
  i,j     : integer;
  sip     : TIpAddressString;
begin

    memo1.Lines.Clear;

    Size := 5120;
    GetMem(AI,Size);
    work:=ai;

    Res := GetAdaptersInfo(work,Size);


    {
    函数返回的当前计算机网络配置信息存在于第一个参数pAdapterInfo指向的IP_ADAPTER_INFO结构

   函数返回的当前计算机网络配置信息存在于第一个参数pAdapterInfo指向的IP_ADAPTER_INFO结构,。
   PIpAdapterInfo = ^TIpAdapterInfo;
   TIP_ADAPTER_INFO = record
   Next: PIpAdapterInfo; //链表指针域,通过它访问整个静态键表
   ComboIndex: DWORD; //保留未用
   AdapterName: //网卡名,max_adapter_name_length=256
   array [0..MAX_ADAPTER_NAME_LENGTH + 3] of Char;
   Description: //对网卡的描述max_adapter_description_length=128
   array [0..MAX_ADAPTER_DESCRIPTION_LENGTH + 3] of Char;
   AddressLength: UINT; //物理地址的长度
   Address: //物理地址,max_adapter_address_length=8每个字节存放一个十六进制的数
   array [0..MAX_ADAPTER_ADDRESS_LENGTH - 1] of BYTE;
   Index: DWORD; //网卡索引号
   Type_: UINT; //网卡类型
   DhcpEnabled: UINT; //是否启用了DHCP动态IP分配
   CurrentIpAddress: PIP_ADDR_STRING; //当前使用的IP地址
   IpAddressList: IP_ADDR_STRING; //绑定到此网卡的IP地址链表
   GatewayList: IP_ADDR_STRING; //网关地址链表
   DhcpServer: IP_ADDR_STRING; //DHCP服务器地址,只有在DhcpEnabled==TRUE的情况下才有效
   HaveWins: BOOL; //是否启用了WINS
   PrimaryWinsServer: IP_ADDR_STRING; //主WINS地址
   SecondaryWinsServer: IP_ADDR_STRING; //辅WINS地址
   LeaseObtained: time_t; //当前DHCP租借获取的时间
   LeaseExpires: time_t; //当前DHCP租借失效时间
  end;

 }











    If (Res <> ERROR_SUCCESS) Then
    Begin
       SetLastError(Res);
       RaiseLastWin32Error;
    End;
    //----------------------------------------------------------
    //showmessage(inttostr(Work^.AddressLength));
    //Work^.AddressLength 是6

    



    repeat

          memo1.Lines.Add ('Adapter address: '+MACToStr(@Work^.Address,Work^.AddressLength));
          memo1.Lines.add(GetAddrString(@Work^.IPAddressList));
          //就是下面这个gatewaystr网关的值总是为空!!!!
         // if work^.GatewayList.IPAddress<>'#0' then

          //gatewaystr:=work^.GatewayList.IPAddress;

         // memo1.Lines.Add('gateway address:'+gatewaystr);


          



    //------------------------------------------------------------------
     j:=0;
     for i:= 0 to 19 do
      begin
          if work^.GatewayList.IPAddress[i]<>#0 then
          begin
               sip[j]:= work^.GatewayList.IPAddress[i];
               inc(j);
          end;
          sip[j]:=#0;
          gatewaystr:=String(sip);
      end;

      memo1.Lines.Add('gateway address:'+gatewaystr);

      memo1.Lines.Add('-------------------------------------------------');

      work:=work^.Next ;

     until (work=nil);

 end;
   

procedure TForm1.Button2Click(Sender: TObject);

var
   Err, BufLen : DWORD;
   P: Pointer;
   ai :PIPAdapterInfo;
   size:integer;
    i,j     : integer;
   sip     : TIpAddressString;
   k:integer;
begin
    k:=0;
    Size := 5120;
    GetMem(AI,Size);
    err := GetAdaptersInfo(ai,Size);
    P := ai;


    //IndexStrs:=Tstringlist.Create;
    if Err =NO_ERROR then
       begin
             while P<>nil do

                  with TIPAdapterInfo(P^) do
                  begin
                    // if DHCPEnabled = 1 then
                    inc(k);
                         memo1.Lines.Add(inttostr(index));
                           //IndexStrs.Add(inttostr(index));
                          // gatewaystr:=ai^.GatewayList.IPAddress;
                             //
                         //  memo1.Lines.Add('gateway address:'+gatewaystr);
                           //------------------------------------------------------
                           //------------------------------------------------------------------
     j:=0;
     for i:= 0 to 39 do
      begin
          if ai^.GatewayList.IPAddress[i]<>#0 then
          begin
               sip[j]:= ai^.GatewayList.IPAddress[i];
               inc(j);
          end;
          sip[j]:=#0;
          gatewaystr:=String(sip);
      end;

    memo1.Lines.Add('gateway address:'+inttostr(k)+'   '+gatewaystr);







                           //------------------------------------------------------


                         P := Next; // TIP_ADAPTER_INFO(P^).Next

                  end // with
        end // while
  else
           showmessage(SysErrorMessage( Error ) );
           Dispose(ai );
end;





procedure TForm1.Button3Click(Sender: TObject);
begin
    memo1.Lines.Clear;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -