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 = &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 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
    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
    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
                    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

解决方案 »

  1.   

    MicroSoft提供了以下几个API:WnetOpenEnum、WnetEnumResource、WNetCloseEnum及一个结构类型NETRESOURCE用于搜索局域网上的网络资源。   其中NETRESOURCE的定义如下: typedef struct _NETRESOURCE { // nr 
     DWORD dwScope; 
     DWORD dwType; 
     DWORD dwDisplayType; 
     DWORD dwUsage; 
     LPTSTR lpLocalName; 
     LPTSTR lpRemoteName; 
     LPTSTR lpComment; 
     LPTSTR lpProvider; 
    } NETRESOURCE;   我们主要用到是dwType(资源类型:磁盘或打印机)、dwDisplayType(资源类型:服务器,域等)、dwUsage(判断是不是容器c o ntainer)、lpRemoteName(资源名称)。   WnetOpenEnum的作用是打开某一特定的资源容器句柄给WnetEnumResource。WnetEnumResource枚举出指定容器下所有网络资源。   下面是一个列出所有网络资源的的函数示例: bool __fastcall TForm1::EnumerateFunc(HWND hwnd ,LPNETRESOURCE lpnr,TTreeNode * ParentNode) 

    DWORD dwResult, dwResultEnum; 
    HANDLE hEnum; 
    DWORD cbBuffer = 16384; /* 16K is reasonable size */ 
    DWORD cEntries = 0xFFFFFFFF; /* enumerate all possible entries */ 
    LPNETRESOURCE lpnrLocal; /* pointer to enumerated structures */ 
    DWORD i; 
    dwResult = WNetOpenEnum(RESOURCE_GLOBALNET, 
    RESOURCETYPE_ANY, 
    0, /* enumerate all resources */ 
    lpnr, /* NULL first time this function is called */ 
    &hEnum); /* handle to resource */ 
    if (dwResult ==67) //domain下没有可访问的主机 
    return true; 
    if (dwResult != NO_ERROR ) { //无 
    ShowError(dwResult); 
    return false; 

    TTreeNode * Child; 
    do { 
    lpnrLocal = (LPNETRESOURCE) GlobalAlloc(GPTR, cbBuffer); dwResultEnum = WNetEnumResource(hEnum, /* resource handle */ 
    &cEntries, /* defined locally as 0xFFFFFFFF */ 
    lpnrLocal, /* LPNETRESOURCE */ 
    &cbBuffer); /* buffer size */ if (dwResultEnum == NO_ERROR) { 
    for(i = 0; i < cEntries; i++) { 
    Child=TreeView1->Items->AddChild(ParentNode,lpnrLocal[i].lpRemoteName); 
    if(RESOURCEUSAGE_c o nTAINER == 
    (lpnrLocal[i].dwUsage & RESOURCEUSAGE_c o nTAINER)) 
    if(!EnumerateFunc(this->Handle, &lpnrLocal[i],Child)) 
    ShowMessage("EnumerateFunc returned FALSE."); 

    } else if (dwResultEnum != ERROR_NO_MORE_ITEMS) { 
    ShowError(dwResultEnum); 
    break; 


    while(dwResultEnum != ERROR_NO_MORE_ITEMS); 
    GlobalFree((HGLOBAL) lpnrLocal); 
    dwResult = WNetCloseEnum(hEnum); 
    if(dwResult != NO_ERROR) { 
    ShowError(dwResult); 
    return FALSE; 

    return true; 
    }   需要说明在win98下,此方法列出的资源和网络邻居列出的是一样,和网络邻居一样,有时列出的数据并不准确,可能会有一些域或机器不能找到
      

  2.   

    哥们
    我要、vb代码
    上面给得vb代码也不好用,死机
      

  3.   

    第一个, abcmouse(鹤飞) 给的代码不死机,我测试过了好用的。
    可能是你没弄明白。
    需要帮助请联系:[email protected]
      

  4.   

    我用他的方法(上面那个代码)运行,vb没反应
    win2000下
    指教!
      

  5.   

    并不是没反应,而是程序用了Debug.Print ……。
    你在最后一句End Sub前设个中断就可以了看到结果了。