加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi 获取本机IP地址和MAC地址

发布时间:2020-12-15 09:55:33 所属栏目:大数据 来源:网络整理
导读:unit NetFunc; interface uses SysUtils,Windows,dialogs,winsock,Classes,ComObj,WinInet,Variants; // 错误信息常量 const C_Err_GetLocalIp = ‘ 获取本地ip失败 ‘ ; C_Err_GetNameByIpAddr = ‘ 获取主机名失败 ‘ ; C_Err_GetSQLServerList = ‘ 获取S
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,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,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,lphEnum);
    if Res <> NO_ERROR then
      break; // 执行失败
    while True do // 列举一个网络类型的所有工作组的信息
    begin
      Count := $FFFFFFFF; // 不限资源数目
      BufSize := 8192; // 缓冲区大小设置为8K
      GetMem(Buf,BufSize); // 申请内存,用于获取工作组信息
      // 获取一个网络类型的文件资源信息,
      Res := WNetEnumResource(lphEnum,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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读