zoukankan      html  css  js  c++  java
  • delphi 获取本机IP地址和MAC地址

    unit NetFunc;
    interface
     
    uses
      SysUtils, Windows, dialogs, winsock, Classes, ComObj, WinInet, Variants;
     
    // 错误信息常量
    const
      C_Err_GetLocalIp = '获取本地ip失败';
      C_Err_GetNameByIpAddr = '获取主机名失败';
      C_Err_GetSQLServerList = '获取SQLServer服务器失败';
      C_Err_GetUserResource = '获取共享资失败';
      C_Err_GetGroupList = '获取所有工作组失败';
      C_Err_GetGroupUsers = '获取工作组中所有计算机失败';
      C_Err_GetNetList = '获取所有网络类型失败';
      C_Err_CheckNet = '网络不通';
      C_Err_CheckAttachNet = '未登入网络';
      C_Err_InternetConnected = '没有上网';
     
      C_Txt_CheckNetSuccess = '网络畅通';
      C_Txt_CheckAttachNetSuccess = '已登入网络';
      C_Txt_InternetConnected = '上网了';
     
      // 检测机器是否登入网络
    function IsLogonNet: Boolean;
     
    // 得到本机的局域网Ip地址
    function GetLocalIP(var LocalIp: string): Boolean;
     
    // 通过Ip返回机器名
    function GetNameByIPAddr(IPAddr: string; var MacName: string): Boolean;
     
    // 获取网络中SQLServer列表
    function GetSQLServerList(var List: Tstringlist): Boolean;
     
    // 获取网络中的所有网络类型
    function GetNetList(var List: Tstringlist): Boolean;
     
    // 获取网络中的工作组
    function GetGroupList(var List: Tstringlist): Boolean;
     
    // 获取工作组中所有计算机
    function GetUsers(GroupName: string; var List: Tstringlist): Boolean;
     
    // 获取网络中的资源
    function GetUserResource(IPAddr: string; var List: Tstringlist): Boolean;
     
    // 映射网络驱动器
    function NetAddConnection(NetPath: Pchar; PassWord: Pchar; LocalPath: Pchar)
      : Boolean;
     
    // 检测网络状态
    function CheckNet(IPAddr: string): Boolean;
     
    // 判断Ip协议有没有安装 这个函数有问题
    function IsIPInstalled: Boolean;
     
    // 检测机器是否上网
    function InternetConnected: Boolean;
     
    // 关闭网络连接
    function NetCloseAll: Boolean;
     
    /// //////////////////////////////////////////////////////////////////////////
    /// ////////////////////////////////////////////////////////////
    /// //////////////////////////////////////////////
    /// /////////// 代码实现部门////////////
     
    { =================================================================
      功 能: 检测机器是否登入网络
      参 数: 无
      返回值: 成功: True 失败: False
      备 注:
      版 本:
      1.0 2002/10/03 09:55:00
      ================================================================= }
    function IsLogonNet: Boolean;
    begin
      Result := False;
      if GetSystemMetrics(SM_NETWORK) <> 0 then
        Result := True;
    end;
     
    { =================================================================
      功 能: 返回本机的局域网Ip地址
      参 数: 无
      返回值: 成功: True, 并填充LocalIp 失败: False
      备 注:
      版 本:
      1.0 2002/10/02 21:05:00
      ================================================================= }
    function GetLocalIP(var LocalIp: string): Boolean;
     
    var
      HostEnt: PHostEnt;
      IP: String;
      Addr: Pchar;
      Buffer: array [0 .. 63] of Char;
      WSData: TWSADATA;
    begin
      Result := False;
      try
        WSAStartUp(2, WSData);
        GetHostName(Buffer, SizeOf(Buffer));
        // Buffer:='ZhiDa16';
        HostEnt := GetHostByName(Buffer);
        if HostEnt = nil then
          exit;
        Addr := HostEnt^.h_addr_list^;
        IP := Format('%d.%d.%d.%d', [Byte(Addr[0]), Byte(Addr[1]), Byte(Addr[2]),
          Byte(Addr[3])]);
        LocalIp := IP;
        Result := True;
      finally
        WSACleanup;
      end;
    end;
     
    { =================================================================
      功 能: 通过Ip返回机器名
      参 数:
      IpAddr: 想要得到名字的Ip
      返回值: 成功: 机器名 失败: ''
      备 注:
      inet_addr function converts a string containing an Internet
      Protocol dotted address into an in_addr.
      版 本:
      1.0 2002/10/02 22:09:00
      ================================================================= }
    function GetNameByIPAddr(IPAddr: String; var MacName: String): Boolean;
     
    var
      SockAddrIn: TSockAddrIn;
      HostEnt: PHostEnt;
      WSAData: TWSADATA;
    begin
      Result := False;
      if IPAddr = '' then
        exit;
      try
        WSAStartUp(2, WSAData);
        SockAddrIn.sin_addr.s_addr := inet_addr(Pchar(IPAddr));
        HostEnt := gethostbyaddr(@SockAddrIn.sin_addr.s_addr, 4, AF_INET);
        if HostEnt <> nil then
          MacName := StrPas(HostEnt^.h_name);
        Result := True;
      finally
        WSACleanup;
      end;
    end;
     
    { =================================================================
      功 能: 返回网络中SQLServer列表
      参 数:
      List: 需要填充的List
      返回值: 成功: True,并填充List 失败 False
      备 注:
      版 本:
      1.0 2002/10/02 22:44:00
      ================================================================= }
    function GetSQLServerList(var List: Tstringlist): Boolean;
     
    var
      i: integer;
      // sRetValue: String;
      SQLServer: Variant;
      ServerList: Variant;
    begin
      // Result := False;
      List.Clear;
      try
        SQLServer := CreateOleObject('SQLDMO.Application');
        ServerList := SQLServer.ListAvailableSQLServers;
        for i := 1 to ServerList.Count do
          List.Add(ServerList.item(i));
        Result := True;
      Finally
        SQLServer := NULL;
        ServerList := NULL;
      end;
    end;
     
    { =================================================================
      功 能: 判断IP协议有没有安装
      参 数: 无
      返回值: 成功: True 失败: False;
      备 注: 该函数还有问题
      版 本:
      1.0 2002/10/02 21:05:00
      ================================================================= }
    function IsIPInstalled: Boolean;
     
    var
      WSData: TWSADATA;
      ProtoEnt: PProtoEnt;
    begin
      Result := True;
      try
        if WSAStartUp(2, WSData) = 0 then
        begin
          ProtoEnt := GetProtoByName('IP');
          if ProtoEnt = nil then
            Result := False
        end;
      finally
        WSACleanup;
      end;
    end;
     
    { =================================================================
      功 能: 返回网络中的共享资源
      参 数:
      IpAddr: 机器Ip
      List: 需要填充的List
      返回值: 成功: True,并填充List 失败: False;
      备 注:
      WNetOpenEnum function starts an enumeration of network
      resources or existing connections.
      WNetEnumResource function continues a network-resource
      enumeration started by the WNetOpenEnum function.
      版 本:
      1.0 2002/10/03 07:30:00
      ================================================================= }
    function GetUserResource(IPAddr: string; var List: Tstringlist): Boolean;
     
    type
      TNetResourceArray = ^TNetResource; // 网络类型的数组
     
    Var
      i: integer;
      Buf: Pointer;
      Temp: TNetResourceArray;
      lphEnum: THandle;
      NetResource: TNetResource;
      Count, BufSize, Res: DWord;
    Begin
      Result := False;
      List.Clear;
      if copy(IPAddr, 0, 2) <> '\' then
        IPAddr := '\' + IPAddr; // 填充Ip地址信息
      FillChar(NetResource, SizeOf(NetResource), 0); // 初始化网络层次信息
      NetResource.lpRemoteName := @IPAddr[1]; // 指定计算机名称
      // 获取指定计算机的网络资源句柄
      Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY,
        RESOURCEUSAGE_CONNECTABLE, @NetResource, lphEnum);
      Buf := nil;
      if Res <> NO_ERROR then
        exit; // 执行失败
      while True do // 列举指定工作组的网络资源
      begin
        Count := $FFFFFFFF; // 不限资源数目
        BufSize := 8192; // 缓冲区大小设置为8K
        GetMem(Buf, BufSize); // 申请内存,用于获取工作组信息
        // 获取指定计算机的网络资源名称
        Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
        if Res = ERROR_NO_MORE_ITEMS then
          break; // 资源列举完毕
        if (Res <> NO_ERROR) then
          exit; // 执行失败
        Temp := TNetResourceArray(Buf);
        for i := 0 to Count - 1 do
        begin
          // 获取指定计算机中的共享资源名称,+2表示删除"\",
          // 如\192.168.0.1 => 192.168.0.1
          List.Add(Temp^.lpRemoteName + 2);
          Inc(Temp);
        end;
      end;
      Res := WNetCloseEnum(lphEnum); // 关闭一次列举
      if Res <> NO_ERROR then
        exit; // 执行失败
      Result := True;
      FreeMem(Buf);
    End;
     
    { =================================================================
      功 能: 返回网络中的工作组
      参 数:
      List: 需要填充的List
      返回值: 成功: True,并填充List 失败: False;
      备 注:
      版 本:
      1.0 2002/10/03 08:00:00
      ================================================================= }
    function GetGroupList(var List: Tstringlist): Boolean;
     
    type
      TNetResourceArray = ^TNetResource; // 网络类型的数组
     
    Var
      NetResource: TNetResource;
      Buf: Pointer;
      Count, BufSize, Res: DWord;
      lphEnum: THandle;
      p: TNetResourceArray;
      i, j: SmallInt;
      NetworkTypeList: TList;
    Begin
      Result := False;
      NetworkTypeList := TList.Create;
      List.Clear;
      // 获取整个网络中的文件资源的句柄,lphEnum为返回名柄
      Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
        RESOURCEUSAGE_CONTAINER, Nil, lphEnum);
      if Res <> NO_ERROR then
        exit; // Raise Exception(Res);//执行失败
      // 获取整个网络中的网络类型信息
      Count := $FFFFFFFF; // 不限资源数目
      BufSize := 8192; // 缓冲区大小设置为8K
      GetMem(Buf, BufSize); // 申请内存,用于获取工作组信息
      Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
      // 资源列举完毕 //执行失败
      if (Res = ERROR_NO_MORE_ITEMS) or (Res <> NO_ERROR) then
        exit;
      p := TNetResourceArray(Buf);
      for i := 0 to Count - 1 do // 记录各个网络类型的信息
      begin
        NetworkTypeList.Add(p);
        Inc(p);
      end;
      Res := WNetCloseEnum(lphEnum); // 关闭一次列举
      if Res <> NO_ERROR then
        exit;
      for j := 0 to NetworkTypeList.Count - 1 do // 列出各个网络类型中的所有工作组名称
      begin // 列出一个网络类型中的所有工作组名称
        NetResource := TNetResource(NetworkTypeList.Items[j]^); // 网络类型信息
        // 获取某个网络类型的文件资源的句柄,NetResource为网络类型信息,lphEnum为返回名柄
        Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
          RESOURCEUSAGE_CONTAINER, @NetResource, lphEnum);
        if Res <> NO_ERROR then
          break; // 执行失败
        while True do // 列举一个网络类型的所有工作组的信息
        begin
          Count := $FFFFFFFF; // 不限资源数目
          BufSize := 8192; // 缓冲区大小设置为8K
          GetMem(Buf, BufSize); // 申请内存,用于获取工作组信息
          // 获取一个网络类型的文件资源信息,
          Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
          // 资源列举完毕 //执行失败
          if (Res = ERROR_NO_MORE_ITEMS) or (Res <> NO_ERROR) then
            break;
          p := TNetResourceArray(Buf);
          for i := 0 to Count - 1 do // 列举各个工作组的信息
          begin
            List.Add(StrPas(p^.lpRemoteName)); // 取得一个工作组的名称
            Inc(p);
          end;
        end;
        Res := WNetCloseEnum(lphEnum); // 关闭一次列举
        if Res <> NO_ERROR then
          break; // 执行失败
      end;
      Result := True;
      FreeMem(Buf);
      NetworkTypeList.Destroy;
    End;
  • 相关阅读:
    C#listbox使用方法
    poj 3894 System Engineer (二分图最大匹配--匈牙利算法)
    Java实现 蓝桥杯VIP 算法训练 连接字符串
    Java实现 蓝桥杯VIP 算法训练 连接字符串
    Java实现 蓝桥杯VIP 算法训练 比较字符串
    Java实现 蓝桥杯VIP 算法训练 比较字符串
    Java实现 蓝桥杯VIP 算法训练 比较字符串
    Java实现 蓝桥杯VIP 算法训练 比较字符串
    Java实现 蓝桥杯VIP 算法训练 比较字符串
    Java实现 蓝桥杯VIP 算法训练 黑白无常
  • 原文地址:https://www.cnblogs.com/m0488/p/9425286.html
Copyright © 2011-2022 走看看