请问如何枚举局域网内的其它计算机的名字和ip地址,请给给完整的vb代码

解决方案 »

  1.   

    '=======================Net_Res.bas==========================
    Option Explicit
    Private Const RESOURCE_CONNECTED As Long = &H1&
    Private Const RESOURCE_GLOBALNET As Long = &H2&
    Private Const RESOURCE_REMEMBERED As Long = &H3&
    Private Const RESOURCEDISPLAYTYPE_DIRECTORY& = &H9
    Private Const RESOURCEDISPLAYTYPE_DOMAIN& = &H1
    Private Const RESOURCEDISPLAYTYPE_FILE& = &H4
    Private Const RESOURCEDISPLAYTYPE_GENERIC& = &H0
    Private Const RESOURCEDISPLAYTYPE_GROUP& = &H5
    Private Const RESOURCEDISPLAYTYPE_NETWORK& = &H6
    Private Const RESOURCEDISPLAYTYPE_ROOT& = &H7
    Private Const RESOURCEDISPLAYTYPE_SERVER& = &H2
    Private Const RESOURCEDISPLAYTYPE_SHARE& = &H3
    Private Const RESOURCEDISPLAYTYPE_SHAREADMIN& = &H8
    Private Const RESOURCETYPE_ANY As Long = &H0&
    Private Const RESOURCETYPE_DISK As Long = &H1&
    Private Const RESOURCETYPE_PRINT As Long = &H2&
    Private Const RESOURCETYPE_UNKNOWN As Long = &HFFFF&
    Private Const RESOURCEUSAGE_ALL As Long = &H0&
    Private Const RESOURCEUSAGE_CONNECTABLE As Long = &H1&
    Private Const RESOURCEUSAGE_CONTAINER As Long = &H2&
    Private Const RESOURCEUSAGE_RESERVED As Long = &H80000000
    Private Const NO_ERROR = 0
    Private Const ERROR_MORE_DATA = 234 'L // dderror
    Private Const RESOURCE_ENUM_ALL As Long = &HFFFFPrivate Type NETRESOURCE
            dwScope As Long         '枚举的范围
            dwType As Long          '枚举的类型
            dwDisplayType As Long   '资源的类型
            dwUsage As Long         '枚举的用法
            pLocalName As Long      '由本地系统引用的资源名称
            pRemoteName As Long     '资源的网络名
            pComment As Long        '由网络供应商设置
            pProvider As Long       '网络供应商的名字
    End Type
    Private Type NETRESOURCE_REAL
            dwScope As Long         '枚举的范围
            dwType As Long          '枚举的类型
            dwDisplayType As Long   '资源的类型
            dwUsage As Long         '枚举的用法
            sLocalName As String    '由本地系统引用的资源名称
            sRemoteName As String   '资源的网络名
            sComment As String      '由网络供应商设置
            sProvider As String     '网络供应商的名字
    End TypePrivate Declare Function WNetAddConnection2 Lib "mpr.dll" Alias "WNetAddConnection2A" (lpNetResource As NETRESOURCE, ByVal lpPassword As String, ByVal lpUserName As String, ByVal dwFlags As Long) As Long
    Private Declare Function WNetOpenEnum Lib "mpr.dll" Alias "WNetOpenEnumA" (ByVal dwScope As Long, ByVal dwType As Long, ByVal dwUsage As Long, lpNetResource As Any, lphEnum As Long) As Long
    Private Declare Function WNetEnumResource Lib "mpr.dll" Alias "WNetEnumResourceA" (ByVal hEnum As Long, lpcCount As Long, lpBuffer As NETRESOURCE, lpBufferSize As Long) As Long
    Private Declare Function WNetCloseEnum Lib "mpr.dll" (ByVal hEnum As Long) As Long
    Private Declare Function VarPtrAny Lib "vb40032.dll" Alias "VarPtr" (lpObject As Any) As Long
    Private Declare Sub CopyMem Lib "kernel32" Alias "RtlMoveMemory" (lpTo As Any, lpFrom As Any, ByVal lLen As Long)
    Private Declare Sub CopyMemByPtr Lib "kernel32" Alias "RtlMoveMemory" (ByVal lpTo As Long, ByVal lpFrom As Long, ByVal lLen As Long)
    Private Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" (ByVal lpString1 As String, ByVal lpString2 As Any) As Long
    Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As Any) As Long
      

  2.   

    '========续
    Sub main()
        Const MAX_RESOURCES = 256
        Const NOT_A_CONTAINER = -1    Dim bFirstTime As Boolean
        Dim lReturn As Long
        Dim hEnum As Long
        Dim lCount As Long
        Dim lMin As Long
        Dim lLength As Long
        Dim l As Long
        Dim lBufferSize As Long
        Dim lLastIndex As Long
        Dim uNetApi(0 To MAX_RESOURCES) As NETRESOURCE
        Dim uNet() As NETRESOURCE_REAL
        
        bFirstTime = True
        DoEvents
        Do
        DoEvents
            If bFirstTime Then
                lReturn = WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, RESOURCEUSAGE_ALL, ByVal 0&, hEnum)
                bFirstTime = False
            Else
                If uNet(lLastIndex).dwUsage And RESOURCEUSAGE_CONTAINER Then
                    lReturn = WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, RESOURCEUSAGE_ALL, uNet(lLastIndex), hEnum)
                Else
                    lReturn = NOT_A_CONTAINER
                    hEnum = 0
                End If
                lLastIndex = lLastIndex + 1
            End If
            If lReturn = NO_ERROR Then
                lCount = RESOURCE_ENUM_ALL
                Do
                DoEvents
                    lBufferSize = UBound(uNetApi) * Len(uNetApi(0)) / 2
                    lReturn = WNetEnumResource(hEnum, lCount, uNetApi(0), lBufferSize)
                    If lCount > 0 Then
                        ReDim Preserve uNet(0 To lMin + lCount - 1) As NETRESOURCE_REAL
                        For l = 0 To lCount - 1
                        DoEvents
                            'Each Resource will appear here as uNet(i)
                            uNet(lMin + l).dwScope = uNetApi(l).dwScope
                            uNet(lMin + l).dwType = uNetApi(l).dwType
                            uNet(lMin + l).dwDisplayType = uNetApi(l).dwDisplayType
                            uNet(lMin + l).dwUsage = uNetApi(l).dwUsage
                            
                            If uNetApi(l).pLocalName Then
                                lLength = lstrlen(uNetApi(l).pLocalName)
                                uNet(lMin + l).sLocalName = Space$(lLength)
                                CopyMem ByVal uNet(lMin + l).sLocalName, ByVal uNetApi(l).pLocalName, lLength
                            End If
                            If uNetApi(l).pRemoteName Then
                                lLength = lstrlen(uNetApi(l).pRemoteName)
                                uNet(lMin + l).sRemoteName = Space$(lLength)
                                CopyMem ByVal uNet(lMin + l).sRemoteName, ByVal uNetApi(l).pRemoteName, lLength
                            End If
                            If uNetApi(l).pComment Then
                                lLength = lstrlen(uNetApi(l).pComment)
                                uNet(lMin + l).sComment = Space$(lLength)
                                CopyMem ByVal uNet(lMin + l).sComment, ByVal uNetApi(l).pComment, lLength
                            End If
                            If uNetApi(l).pProvider Then
                                lLength = lstrlen(uNetApi(l).pProvider)
                                uNet(lMin + l).sProvider = Space$(lLength)
                                CopyMem ByVal uNet(lMin + l).sProvider, ByVal uNetApi(l).pProvider, lLength
                            End If
                        Next l
                    End If
                    lMin = lMin + lCount
                Loop While lReturn = ERROR_MORE_DATA
            End If
            If hEnum Then
                l = WNetCloseEnum(hEnum)
            End If
        Loop While lLastIndex < lMin
        If UBound(uNet) > 0 Then
            For l = 0 To UBound(uNet)
            DoEvents
                Select Case uNet(l).dwDisplayType
                        Case RESOURCEDISPLAYTYPE_DIRECTORY&
                                Debug.Print "Directory...",
                        Case RESOURCEDISPLAYTYPE_DOMAIN
                                Debug.Print "Domain...",
                        Case RESOURCEDISPLAYTYPE_FILE
                                Debug.Print "File...",
                        Case RESOURCEDISPLAYTYPE_GENERIC
                                Debug.Print "Generic...",
                        Case RESOURCEDISPLAYTYPE_GROUP
                                Debug.Print "Group...",
                        Case RESOURCEDISPLAYTYPE_NETWORK&
                                Debug.Print "Network...",
                        Case RESOURCEDISPLAYTYPE_ROOT&
                                Debug.Print "Root...",
                        Case RESOURCEDISPLAYTYPE_SERVER
                                Debug.Print "Server...",
                        Case RESOURCEDISPLAYTYPE_SHARE
                                Debug.Print "Share...",
                        Case RESOURCEDISPLAYTYPE_SHAREADMIN&
                                Debug.Print "ShareAdmin...",
                End Select
                Debug.Print uNet(l).sRemoteName, uNet(l).sComment
            Next l
        End If
    End Sub
      

  3.   

    '根据主机名获得IP地址...反过来也行!
    Option Explicit
    Private Declare Function gethostname Lib "WSOCK32.DLL" (ByVal szHost As String, ByVal dwHostLen As Long) As Long
    Private Declare Function gethostbyname Lib "WSOCK32.DLL" (ByVal szHost As String) As Long
    Private Declare Function WSAStartup Lib "WSOCK32.DLL" (ByVal wVersionRequired As Long, lpWSADATA As WSADATA) As Long
    Private Declare Function WSAGetLastError Lib "WSOCK32.DLL" () As Long
    Private Declare Function WSACleanup Lib "WSOCK32.DLL" () As Long
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, ByVal hpvSource As Long, ByVal cbCopy As Long)'' Socket错误常数和版本常数
    Private Const SOCKET_ERROR As Long = -1
    Private Const MAX_WSADescription = 256
    Private Const MAX_WSASYSStatus = 128
    Private Const ERROR_SUCCESS As Long = 0
    Private Const WS_VERSION_REQD As Long = &H101
    Private Const MIN_SOCKETS_REQD As Long = 1
    Private Const WS_VERSION_MAJOR As Long = WS_VERSION_REQD \ &H100 And &HFF&
    Private Const WS_VERSION_MINOR As Long = WS_VERSION_REQD And &HFF&'' 存放主机信息的结构
    Private Type HOSTENT
            hName As Long '' 主机的正式名称
            hAliases As Long '' 主机别名列表
            hAddrType As Integer '' 主机地址类型
            hLen As Integer '' 主机地址长度
            hAddrList As Long '' 主机IP地址列表
    End Type'' 存放Winsock版本等信息的结构
    Private Type WSADATA
            wVersion As Integer
            wHighVersion As Integer
            szDescription(0 To MAX_WSADescription) As Byte
            szSystemStatus(0 To MAX_WSASYSStatus) As Byte
            wMaxSockets As Integer
            wMaxUDPDG As Integer
            dwVendorInfo As Long
    End Type'' 返回给定机器名的Ip地址,机器名为空时返回本机Ip地址
    Public Function GetIPAddress(sHost As String) As String
        Dim sHostName As String * 256
        Dim lpHost As Long
        Dim HOST As HOSTENT
        Dim dwIPAddr As Long
        Dim tmpIPAddr() As Byte
        Dim i As Integer
        Dim sIPAddr As String
        Dim werr As Long    '' 如果无法初始化Socket则退出函数
        If Not SocketsInitialize() Then
           GetIPAddress = ""
           Exit Function
        End If    sHostName = Trim$(sHost) & vbNullChar 'Chr$(0)    '' 获得指向主机信息结构的指针
        lpHost = gethostbyname(sHostName)    '' 如果指针为零,则错误退出
        If lpHost = 0 Then
           werr = WSAGetLastError()
           GetIPAddress = ""
           SocketsCleanup
           Exit Function
        End If    '' 从指定内存取得数据
        CopyMemory HOST, lpHost, Len(HOST)
        CopyMemory dwIPAddr, HOST.hAddrList, 4    '' 重新动态分配变量内存
        ReDim tmpIPAddr(1 To HOST.hLen)
        '' 将主机地址存储到tmpIPAddr中
        CopyMemory tmpIPAddr(1), dwIPAddr, HOST.hLen    '' 获得最终的主机IP地址字符串
        For i = 1 To HOST.hLen
            sIPAddr = sIPAddr & tmpIPAddr(i) & "."
        Next
        
        '' 释放Socket库所占用的系统资源
        SocketsCleanup
        
        '' 返回
        GetIPAddress = Mid$(sIPAddr, 1, Len(sIPAddr) - 1)
        
    End Function'' 初始化Socket
    Private Function SocketsInitialize(Optional sErr As String) As Boolean
        Dim WSAD As WSADATA
        Dim sLoByte As String
        Dim sHiByte As String    '' 初始化Winsock DLL,并判断版本是否满足要求
        If WSAStartup(WS_VERSION_REQD, WSAD) <> ERROR_SUCCESS Then
           sErr = "The 32-bit Windows Socket is not responding."
           SocketsInitialize = False
           Exit Function
        End If    '' 判断是否有支持足够的Socket
        If WSAD.wMaxSockets < MIN_SOCKETS_REQD Then
           sErr = "This application requires a minimum of " & CStr(MIN_SOCKETS_REQD) & " supported sockets."
           SocketsInitialize = False
           Exit Function
        End If    '' 判断Winsock的版本是否被32为Winsock支持
        If LoByte(WSAD.wVersion) < WS_VERSION_MAJOR Or (LoByte(WSAD.wVersion) = WS_VERSION_MAJOR And HiByte(WSAD.wVersion) < WS_VERSION_MINOR) Then       sHiByte = CStr(HiByte(WSAD.wVersion))
           sLoByte = CStr(LoByte(WSAD.wVersion))       sErr = "Sockets version " & sLoByte & "." & sHiByte & _
           " is not supported by 32-bit Windows Sockets."       SocketsInitialize = False
           Exit Function
        End If    SocketsInitialize = True
    End Function'' 释放Socket库所占用的系统资源
    Private Sub SocketsCleanup()
        If WSACleanup() <> ERROR_SUCCESS Then
           App.LogEvent "Socket error occurred in Cleanup.", vbLogEventTypeError
        End If
    End Sub'' 获得一个整数的高字节位
    Private Function HiByte(ByVal wParam As Integer)
        HiByte = wParam \ &H1 And &HFF&
    End Function'' 获得一个整数的低字节位
    Private Function LoByte(ByVal wParam As Integer)
        LoByte = wParam And &HFF&
    End Function
      

  4.   

    遍历局域网中的所有资源:http://www.applevb.com/sourcecode/WMEnumResource.zip