网上的教程没有一个能在多网卡或多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
分享到:
相关推荐
例如,你可以使用`GetAdaptersInfo`函数,这是一个来自`Iphlpapi.dll`库的API调用,用于获取网络适配器的信息,其中包括MAC地址。要实现这一功能,你需要定义该函数的原型,并创建一个结构体来存储返回的适配器信息...
在“VB调用API修改本机IP”这个主题中,我们将探讨如何利用VB来调用操作系统底层的API函数,以获取和修改本地连接的局域网IP地址。 首先,API(Application Programming Interface)是操作系统提供给开发者的一组...
3. **分配内存和调用API**:VB6中没有动态内存分配,所以需要先为`IP_ADAPTER_INFO`结构分配足够的内存,然后调用`GetAdaptersInfo`函数。 ```vb Dim pAdapter As IP_ADAPTER_INFO Dim bufLen As Long bufLen = ...
总之,通过VB调用WinAPI函数`GetAdaptersInfo`,我们可以获取到电脑的网络适配器信息,进一步提取出MAC地址。这个过程涉及到了API调用、结构体定义以及错误处理等知识点,对于深入理解VB与系统底层交互机制非常有...
这两个方法都可以在VB6.0中获取真实的MAC地址,但请注意,`GetAdaptersInfo`更适用于本地机器的多适配器环境,而`SendARP`则更为底层,可能需要更多的处理。实际应用时,应根据项目需求选择合适的方法。在开发过程中...
总的来说,通过VB程序调用`GetAdaptersInfo` API函数是获取本机IP地址的有效方法。理解如何导入库、声明API函数、定义结构体以及正确处理内存分配是成功实现这一功能的关键。这不仅对于学习VB编程,对其他编程语言和...
因为GetAdaptersInfo会修改pAdapterInfo参数,所以我们需要先分配足够的内存来存储结果,然后调用GetAdaptersInfo。 6. **处理返回值**: GetAdaptersInfo返回一个错误代码,0表示成功。如果失败,需要检查错误...
在VB(Visual Basic)编程中,API(Application Programming Interface)函数是用于调用操作系统功能的接口,可以帮助开发者实现一些在VB内置库中未提供的功能,例如获取本机IP地址。本话题将深入探讨如何利用VB API...
当需要获取计算机硬件信息,如网卡物理序列号时,VB API调用是常用的方法。网卡物理序列号,也称为MAC(Media Access Control)地址,是网络设备的唯一标识符,用于在网络中区分不同的设备。 以下是一些关键知识点...
在描述中提到,下载的源码可能包含一个名为`GetMACaddress`的文件,这可能是一个VB工程或者是一个VB模块,里面实现了上述过程或其他获取MAC地址的方法。运行VB6.0软件并直接点击F5,VB将编译并执行代码,显示出...
2. 定义结构体:API函数`GetAdaptersInfo`返回的数据是结构体的形式,因此我们需要在VB中定义这个结构体。结构体中会包含关于网络适配器的信息,包括MAC地址。 3. 调用API获取信息:使用`GetAdaptersInfo`函数,...
在VB6.0环境下开发应用程序时,有时我们需要获取本机网卡的物理地址...以上就是通过VB6.0使用API函数获取本机网卡物理地址的方法。通过理解这些API和结构体,开发者可以更深入地控制和管理网络设置,实现更多高级功能。
VB中获取MAC地址通常需要调用WinAPI函数,如`GetAdaptersInfo`或`SendARP`。`GetAdaptersInfo`用于获取本地计算机所有网络适配器的信息,包括MAC地址;而`SendARP`则可以用于获取远程主机的MAC地址,但需要知道其IP...
描述中提到的"VB获取本机IP地址的方法"是一个相关的知识点,这通常涉及到VB中的Socket编程或者WMI(Windows Management Instrumentation)技术来获取网络接口的IP配置信息。然而,此描述更专注于"获取MAC的源码",这...
2. **API 调用**:如使用Windows API函数(如`SendARP`, `GetNetworkParams`, `GetAdaptersInfo`等)获取网络信息。 3. **Multithreading**:为了实现并发监控多个网络设备,可能需要用到多线程技术。 4. **定时器...
总的来说,VB3程序员可以通过学习和理解这些API调用,扩展他们的应用程序以执行与系统和网络相关的任务。不过,要注意的是,直接操作系统设置应当谨慎,以避免可能引发的安全问题和系统不稳定。在编写这类代码时,...
最后,对于初学者来说,理解VB调用Windows API的过程,学习结构体、指针和错误处理等概念,对提升VB编程能力非常有帮助。同时,这也是一种跨平台技术,因为许多操作系统都提供了类似的API来访问硬件信息。
2. **定义API函数**:VB中,你需要声明并定义Windows API函数,例如`GetAdaptersInfo`用于获取网络接口信息,`SetAdapterAddress`用于设置MAC地址。每个函数的参数和返回值都需要正确指定。 3. **获取网络接口信息*...
在IT行业中,VB(Visual Basic)是一种常用的编程语言...总的来说,通过VB获取网卡ID是一项涉及API调用、内存管理和错误处理的复杂任务,但掌握了这些技术,开发者就能为共享软件提供更精确的授权机制,有效防止盗版。
总的来说,通过VB调用Windows API,我们可以获取到详细的网络接口信息,这对于网络诊断、自动化脚本编写以及各种网络应用开发都非常重要。理解并熟练掌握这些技巧,将有助于你更好地进行VB编程,并解决实际问题。