在VB6中获取本地IP地址而不使用Winsock控件

3

如何在VB6中获取本地IP地址而不使用Winsock控件

我不想使用或需要Winsock的原因是我的应用程序应该可以离线工作。

我对VB6有点陌生,我的搜索没有结果。我想我需要一些WinAPI和任何指针或代码示例都将不胜感激。


实际上,我没有测试除winsock之外的任何东西。也许现在改变我的问题已经太晚了,因为我要求没有winsock的方法,现在我有以下两个有效答案。但对我来说不好的消息是,这两种方法都需要互联网连接。 - Panayot Karabakalov
2个回答

4

这是我喜欢使用的一个函数,不需要API:

Public Function getIP()

Dim WMI     As Object
Dim qryWMI  As Object
Dim Item    As Variant

    Set WMI = GetObject("winmgmts:\\.\root\cimv2")

    Set qryWMI = WMI.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration " & _
                               "WHERE IPEnabled = True")

    For Each Item In qryWMI
      getIP = Item.IPAddress(0)
    Next

    Set WMI = Nothing
    Set qryWMI = Nothing

End Function

看起来不能接受多个答案,但非常感谢你的解决方案!我在VBScript中使用WMI,但不知何故忘记了它,真是太丢人了 :) - Panayot Karabakalov
@PanayotKarabakalov 没问题,很高兴能帮忙。 - Matt Donnan

2

以下内容来自:VB函数查找IP地址

Private Declare Function GetIpAddrTable_API Lib "IpHlpApi" Alias "GetIpAddrTable" (pIPAddrTable As Any, pdwSize As Long, ByVal bOrder As Long) As Long

' Returns an array with the local IP addresses (as strings).
' Author: Christian d'Heureuse, www.source-code.biz
Public Function GetIpAddrTable()
   Dim Buf(0 To 511) As Byte
   Dim BufSize As Long: BufSize = UBound(Buf) + 1
   Dim rc As Long
   rc = GetIpAddrTable_API(Buf(0), BufSize, 1)
   If rc <> 0 Then Err.Raise vbObjectError, , "GetIpAddrTable failed with return value " & rc
   Dim NrOfEntries As Integer: NrOfEntries = Buf(1) * 256 + Buf(0)
   If NrOfEntries = 0 Then GetIpAddrTable = Array(): Exit Function
   ReDim IpAddrs(0 To NrOfEntries - 1) As String
   Dim i As Integer
   For i = 0 To NrOfEntries - 1
      Dim j As Integer, s As String: s = ""
      For j = 0 To 3: s = s & IIf(j > 0, ".", "") & Buf(4 + i * 24 + j): Next
      IpAddrs(i) = s
      Next
   GetIpAddrTable = IpAddrs
   End Function



' Test program for GetIpAddrTable.
Public Sub Test()
   Dim IpAddrs
   IpAddrs = GetIpAddrTable
   Debug.Print "Nr of IP addresses: " & UBound(IpAddrs) - LBound(IpAddrs) + 1
   Dim i As Integer
   For i = LBound(IpAddrs) To UBound(IpAddrs)
      Debug.Print IpAddrs(i)
      Next
   End Sub

我在我的电脑上测试了它,结果有两个IP地址。通常情况下,我会认为第二个是我的实际IP地址。


非常感谢!看起来下次在提问之前我应该更加努力地搜索。在我的XP系统中,第二个地址是我的实际IP地址。我也会在Win7/8上测试这个函数,但这是我的家庭作业。 - Panayot Karabakalov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接