在VB程序里面,如何获得局域网内所有的机器名或者IP。

解决方案 »

  1.   

    WNetOpenEnum

    WNetEnumResource
    两个API就可以了
      

  2.   

    http://www.csdn.net/cnshare/soft/16/16015.shtm网络资源访问技术的代码
      

  3.   


    '在窗体上加一个treeview名为TrvComputerOption ExplicitPrivate 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 = &HFFFF
    Private 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 Type
    Private 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 LongSub GetLocalInfo()
    Dim nodX As Node    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
        Do
            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
                    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
                            '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
        TrvComputer.Nodes.Add , , "R", "网络资源"
        If UBound(uNet) > 0 Then
            For l = 0 To UBound(uNet)
                Select Case uNet(l).dwDisplayType
                    Case RESOURCEDISPLAYTYPE_DIRECTORY&
                   '     Debug.Print "Directory...",
                    Case RESOURCEDISPLAYTYPE_DOMAIN
                    '    TrvComputer.Nodes.Add , , "R", "Domain..." & uNet(l).sRemoteName, 1
                       ' 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
                        Set nodX = TrvComputer.Nodes.Add("R", tvwChild, "node" & l, uNet(l).sRemoteName)
                        
                    '    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
        nodX.EnsureVisible
    End SubPrivate Sub Form_Load()
        Call GetLocalInfo
    End Sub
      

  4.   

    你要多详细的??我发现这两个涵数在98和2000下有区别
    '-------------------模块-------------------------------------
    Option ExplicitPublic Type NETRESOURCE
       dwScope As Long
       dwType As Long
       dwDisplayType As Long
       dwUsage As Long
       lpLocalName As Long
       lpRemoteName As Long
       lpComment As Long
       lpProvider As Long
    End TypePublic Type NETRES2
        dwScope As Long
        dwType As Long
        dwDisplayType As Long
        dwUsage As Long
        lpLocalName As String
        lpRemoteName As String
        lpComment As String
        lpProvider As String
    End TypePublic 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 LongPublic Declare Function WNetEnumResource Lib "mpr.dll" Alias _
      "WNetEnumResourceA" (ByVal hEnum As Long, lpcCount As Long, _
      ByVal lpBuffer As Long, lpBufferSize As Long) As LongPublic Declare Function WNetCloseEnum Lib "mpr.dll" _
       (ByVal hEnum As Long) As LongPublic Const RESOURCE_CONNECTED = &H1
    Public Const RESOURCE_GLOBALNET = &H2
    Public Const RESOURCE_REMEMBERED = &H3Public Const RESOURCETYPE_ANY = &H0
    Public Const RESOURCETYPE_DISK = &H1
    Public Const RESOURCETYPE_PRINT = &H2
    Public Const RESOURCETYPE_UNKNOWN = &HFFFFPublic Const RESOURCEUSAGE_CONNECTABLE = &H1
    Public Const RESOURCEUSAGE_CONTAINER = &H2
    Public Const RESOURCEUSAGE_RESERVED = &H80000000Public Const GMEM_FIXED = &H0
    Public Const GMEM_ZEROINIT = &H40
    Public Const GPTR = (GMEM_FIXED Or GMEM_ZEROINIT)Public Declare Function GlobalAlloc Lib "KERNEL32" _
      (ByVal wFlags As Long, ByVal dwBytes As Long) As LongPublic Declare Function GlobalFree Lib "KERNEL32" _
      (ByVal hMem As Long) As LongPublic Declare Sub CopyMemory Lib "KERNEL32" Alias _
      "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, _
       ByVal cbCopy As Long)
       
    Public Declare Function CopyPointer2String Lib _
      "KERNEL32" Alias "lstrcpyA" (ByVal NewString As _
      String, ByVal OldString As Long) As Long'-------------------------以上-----------------------------    Dim hEnum As Long, lpBuff As Long, NR As NETRESOURCE
        Dim cbBuff As Long, cCount As Long
        Dim p As Long, res As Long, i As Long
        Dim nodX As Node
        Set nodX = TreeView1.Nodes.Add(, , "R", "Root")
        If Err.Number > 0 Then Exit Sub
        NR.lpRemoteName = 0
        cbBuff = 10000
        cCount = &HFFFFFFFF
        res = WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, NR, hEnum)
        If res = 0 Then
            lpBuff = GlobalAlloc(GPTR, cbBuff)
            res = WNetEnumResource(hEnum, cCount, lpBuff, cbBuff)
            If res = 0 Then
                p = lpBuff
                For i = 1 To cCount
                    CopyMemory NR, ByVal p, LenB(NR)
                    nodX.Text = PointerToString(NR.lpRemoteName)
                    nodX.Image = 1
                    'List1.AddItem PointerToString(NR.lpRemoteName)
                    p = p + LenB(NR)
                Next i
                WNetCloseEnum (hEnum)
                hEnum = 0
                res = WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, NR, hEnum)
                If res = 0 Then
                    lpBuff = GlobalAlloc(GPTR, cbBuff)
                    cCount = &HFFFFFFFF
                    res = WNetEnumResource(hEnum, cCount, lpBuff, cbBuff)
                    If res = 0 Then
                        p = lpBuff
                        For i = 1 To cCount
                            CopyMemory NR, ByVal p, LenB(NR)
                            Set nodX = TreeView1.Nodes.Add("R", tvwChild, PointerToString(NR.lpRemoteName), "")
                            nodX.Text = PointerToString(NR.lpRemoteName)
                            nodX.Image = 2
                            'List1.AddItem PointerToString(NR.lpRemoteName)
                            p = p + LenB(NR)
                        Next i
                    End If
                End If
                WNetCloseEnum (hEnum)
            End If
    End If
    这一段是列也局域中的域
    如果是你要计算机的话
    把open 中的NR换一下就可以了
      

  5.   

    这段代码在我机子上是可以了。你可以用google搜一下这两个函数的用法就可以知道了。