网上的教程没有一个能在多网卡或多IP下用的,总是在 CopyMemory 时程序崩溃,没办法,只好自己找原因了,几次崩溃之后,终于找到了原因,在用 0& 调用后返回的AdapterInfoSize 在多网卡时,长度超过了IP_ADAPTER_INFO 结构,而所有教程都是用AdapterInfoSize 调用的CopyMemory ,所以程序崩溃就是必然了,找到问题,解决就相对简单了,用 sizeof(IP_ADAPTER_INFO)就对了,可惜VB 没有这个运算符,只好自己定义一个常量来代替,完整代码如下,希望能帮助一些人。
Public Const MAX_ADAPTER_NAME_LENGTH = 260
Public Const MAX_ADAPTER_ADDRESS_LENGTH = 8
Public Const MAX_ADAPTER_DESCRIPTION_LENGTH = 132
Public Const IP_ADAPTER_INFO_LENGTH = 640
Type IP_ADDR_STRING
Next As Long
IpAddress As String * 16
IpMask As String * 16
Context As Long
End Type
Type IP_ADAPTER_INFO
Next As Long
ComboIndex As Long
AdapterName As String * MAX_ADAPTER_NAME_LENGTH
Description As String * MAX_ADAPTER_DESCRIPTION_LENGTH
AddressLength As Long
Address(MAX_ADAPTER_ADDRESS_LENGTH - 1) As Byte
Index As Long
Type As Long
DhcpEnabled As Long
CurrentIpAddress As Long
IpAddressList As IP_ADDR_STRING
GatewayList As IP_ADDR_STRING
DhcpServer As IP_ADDR_STRING
HaveWins As Byte
PrimaryWinsServer As IP_ADDR_STRING
SecondaryWinsServer As IP_ADDR_STRING
LeaseObtained As Long
LeaseExpires As Long
End Type
Public Declare Function GetAdaptersInfo Lib "iphlpapi.dll" (IpAdapterInfo As Any, pOutBufLen As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
Public Function GetewayIP() As String
Dim AdapterInfoSize As Long
Dim AdapterInfo As IP_ADAPTER_INFO
Dim AdapterInfoBuffer() As Byte
Dim ptr1 As Long
AdapterInfoSize = 0
Call GetAdaptersInfo(ByVal 0&, AdapterInfoSize)
ReDim AdapterInfoBuffer(AdapterInfoSize - 1)
If 0 = GetAdaptersInfo(AdapterInfoBuffer(0), AdapterInfoSize) Then
ptr1 = VarPtr(AdapterInfoBuffer(0))
Do While (ptr1 <> 0)
CopyMemory AdapterInfo, ByVal ptr1, IP_ADAPTER_INFO_LENGTH
If InStr(AdapterInfo.GatewayList.IpAddress, Chr(0)) > 6 Then
GetwayIP = Left(AdapterInfo.GatewayList.IpAddress, InStr(AdapterInfo.GatewayList.IpAddress, Chr(0)) - 1)
Exit Function
End If
ptr1 = AdapterInfo.Next
Loop
End If
End Function
分享到:
相关推荐
39422_GetAdaptersInfo1 取得系統資源
调用GetAdaptersInfo获取网卡信息并通过WIFIAPI获取当前无线网卡状态和SSID信息。
hook_GetAdaptersInfo
GetAdaptersInfo 和 GetAdaptersAddresses 都能获取网络相关信息,如网卡名称、MAC 地址、IP、DNS、网关等信息,但是两个函数感觉都有一些问题,GetAdaptersInfo 获取不到 IPV6 地址信息,使用起来较为简单,...
使用windows sdk提供的API函数GetAdaptersInfo获得本机所有网卡的网卡名、网卡描述、网卡MAC地址、网卡IP、网卡类型等信息,并用IP_ADAPTER_INFO结构体存储,使用GetIfEntry获取网卡的状态,可有效判断出网卡通讯...
后来有个 有位老师告诉我说网上的 取网卡的名字都是错的 网上大部分用的是 PacketGetAdapterNames 取所有网卡名字的字符串 而 老师告诉我 正确的应该用 GetAdaptersInfo 来取 其网卡信息 然后再 从相关结构体中取出 ...
pb使用函数GetAdaptersInfo 这个资源,是我自己写的代码,我违反了什么规定?
实战DeviceIoControl教你如何运用实战DeviceIoControl函数读取硬件信息
hook_钩子程序-delphihook_钩子程序-delphihook_钩子程序-delphi
本文介绍如何使用命令行工具,获取运行 Microsoft Windows XP Service Pack 2 (SP2)、Windows Server 2003、Windows Vista (目前处于 beta 测试阶段)或 Windows Server“Longhorn”(目前处于 beta 测试阶段)的...
VC++源码 一个使用detours来HookAPI的简单例子 ...GetAdaptersInfo获取MAC Hook这两个API改变获取的硬盘串号和MAC地址 HDHook工程 生成dll GetHDDSN工程 载入生成的dll 获取硬盘串号和MAC地址 需要自行安装detours
pb9程序直接获取ip地址,mac地址,mac获取方法为网络搜集资料
获取网卡Mac地址的C++代码3,有三种方法
获取客户端IP函数详细做法, Function getIP() Dim strIPAddr If Request.... strIPAddr = Request.ServerVariables("REMOTE_ADDR") ...") > 0 Then ... getIP = Trim(Mid(strIPAddr, 1, 30)) End Function
一个简单的HOOK钩子实现程序代码,帮助你更好的理解钩子的挂接和应用
hook deviceiocontrol api 实现随机序列号可修改代码指定序列号
hookdiskid hookdiskid下载 hookdiskid怎么用 硬盘id修改器 硬盘物理id修改器 修改硬盘id 修改虚拟机硬盘id pb修改硬盘id 硬盘id
功能的实现都非常简单,有五种函数可以直接调用: 1.用于获取本地网络适配器信息的函数: DWORD GetAdaptersInfo( PIP_ADAPTER_INFO pAdapterInfo, PULONG pOutBufLen ); 2.用于获取本地主机名、域名和DNS服务器...
易语言获得网卡信息类 系统结构:获取网络信息_DOS管道,获取网络信息_API,判断控制,操作网卡,设置IP地址,前缀补零,过滤函数,GetAdaptersInfo,Len_iai,Len_ias,取变量地址_字节集,CopyMemory_iai,Copy
纯PB代码实现,使用系统API,直接获取MAC和IP(PB9)。内附强大BLOB数据展示、调试工具。