realbasic-nug
[Top] [All Lists]

Re: Getting Network volumes list

To: REALbasic NUG <realbasic-nug at lists dot realsoftware dot com>
Subject: Re: Getting Network volumes list
From: Christian Miller <realbasic at nc dot rr dot com>
Date: Fri, 30 May 2008 11:41:53 -0400
Authentication-results: mx.google.com; spf=pass (google.com: domain of realbasic-nug-bounces at lists dot realsoftware dot com designates 66.116.103.65 as permitted sender) smtp dot mail=realbasic-nug-bounces at lists dot realsoftware dot com
Delivered-to: listarchive at realsoftware dot com
Delivered-to: realbasic-nug at lists dot realsoftware dot com
References: <p06240803c4657c2fd7bf at [62 dot 161 dot 36 dot 122]> <48401848 dot 6080808 at rpgportland dot com>
> Hello Everybody,
>
> I'm looking for a DLL function listing all network volumes mounted on
> a workstation (XP and Vista).
>
> FindFirstVolume, FindNextVolume and FindVolumeClose don't list  
> network volumes.
> GetLogicalDriveStrings gives all used letters, including network
> volumes, but no other information (GUID).
>
> Do you know of a DLL call like FindFirstSharedVolume, or
> FindFirstNetworkVolume, or something like this ? I didn't find such a
> thing.
>


Here is some VB code I had laying around that should do it:

Option Explicit

Private 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 Type

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, _
   ByVal lpBuffer As Long, lpBufferSize As Long) As Long

Private Declare Function WNetCloseEnum Lib "mpr.dll" _
    (ByVal hEnum As Long) As Long

Private Const RESOURCE_CONNECTED = &H1
Private Const RESOURCE_GLOBALNET = &H2
Private Const RESOURCE_REMEMBERED = &H3

Private Const RESOURCETYPE_ANY = &H0
Private Const RESOURCETYPE_DISK = &H1
Private Const RESOURCETYPE_PRINT = &H2
Private Const RESOURCETYPE_UNKNOWN = &HFFFF

Private Const RESOURCEUSAGE_CONNECTABLE = &H1
Private Const RESOURCEUSAGE_CONTAINER = &H2
Private Const RESOURCEUSAGE_RESERVED = &H80000000

Private Const GMEM_FIXED = &H0
Private Const GMEM_ZEROINIT = &H40
Private Const GPTR = (GMEM_FIXED Or GMEM_ZEROINIT)

Private Declare Function GlobalAlloc Lib "KERNEL32" _
   (ByVal wFlags As Long, ByVal dwBytes As Long) As Long

Private Declare Function GlobalFree Lib "KERNEL32" _
   (ByVal hMem As Long) As Long

Private Declare Sub CopyMemory Lib "KERNEL32" Alias _
   "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, _
    ByVal cbCopy As Long)

Private Declare Function CopyPointer2String Lib _
   "KERNEL32" Alias "lstrcpyA" (ByVal NewString As _
   String, ByVal OldString As Long) As Long

Public Function DoNetEnum(list As Object) As Boolean

'PURPOSE: DISPLAYS NETWORK NAME AND
'ALL COMPUTERS ON THE NETWORK IN A LIST
'BOX

'PARAMETER: ListBox (or any control with similar
'interface, such as ComboBox) in which to display
'list of computers

'RETURNS: True if successful, false otherwise

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

On Error Resume Next
'test to see if list is a
'list box type control
list.AddItem " "
list.Clear
If Err.Number > 0 Then Exit Function

On Error GoTo ErrorHandler

'Setup the NETRESOURCE input structure.
NR.lpRemoteName = 0
cbBuff = 10000
cCount = &HFFFFFFFF

'Open a Net enumeration operation handle: hEnum.
res = WNetOpenEnum(RESOURCE_GLOBALNET, _
   RESOURCETYPE_ANY, 0, NR, hEnum)

If res = 0 Then

    'Create a buffer large enough for the results.
    '10000 bytes should be sufficient.
    lpBuff = GlobalAlloc(GPTR, cbBuff)
    'Call the enumeration function.
    res = WNetEnumResource(hEnum, cCount, lpBuff, cbBuff)
    If res = 0 Then
       p = lpBuff
       'WNetEnumResource fills the buffer with an array of
       'NETRESOURCE structures. Walk through the list and print
       'each local and remote name.
       For i = 1 To cCount
          ' All we get back are the Global Network Containers ---  
Enumerate each of these
          CopyMemory NR, ByVal p, LenB(NR)
          list.AddItem "Network Name " & _
             PointerToString(NR.lpRemoteName)

          DoNetEnum2 NR, list
          p = p + LenB(NR)
       Next i
       End If
DoNetEnum = True

ErrorHandler:
On Error Resume Next
    If lpBuff <> 0 Then GlobalFree (lpBuff)
    WNetCloseEnum (hEnum) 'Close the enumeration

End If

End Function

Private Function PointerToString(p As Long) As String

    'The values returned in the NETRESOURCE structures are pointers to
    'ANSI strings so they need to be converted to Visual Basic Strings.

    Dim s As String
    s = String(255, Chr$(0))
    CopyPointer2String s, p
    PointerToString = Left(s, InStr(s, Chr$(0)) - 1)

End Function

Private Sub DoNetEnum2(NR As NETRESOURCE, list As Object)

    Dim hEnum As Long, lpBuff As Long
    Dim cbBuff As Long, cCount As Long
    Dim p As Long, res As Long, i As Long

    'Setup the NETRESOURCE input structure.
    cbBuff = 10000
    cCount = &HFFFFFFFF

    'Open a Net enumeration operation handle: hEnum.
    res = WNetOpenEnum(RESOURCE_GLOBALNET, _
      RESOURCETYPE_ANY, 0, NR, hEnum)

    If res = 0 Then

       'Create a buffer large enough for the results.
       '10000 bytes should be sufficient.
       lpBuff = GlobalAlloc(GPTR, cbBuff)
       'Call the enumeration function.
       res = WNetEnumResource(hEnum, cCount, lpBuff, cbBuff)

       If res = 0 Then
          p = lpBuff
          'WNetEnumResource fills the buffer with an array of
          'NETRESOURCE structures. Walk through the list and print
          'each remote name.
          For i = 1 To cCount
             CopyMemory NR, ByVal p, LenB(NR)
             list.AddItem "Network Computer #" & i & " " &  
PointerToString(NR.lpRemoteName)
             p = p + LenB(NR)
          Next i
       End If

       If lpBuff <> 0 Then GlobalFree (lpBuff)
       WNetCloseEnum (hEnum) 'Close the enumeration

    End If

End Sub





Christian
Pariahware, Inc. - REALbasic Consulting
<pariahware at pariahware dot com>
<http://www.realbasicconsultant.com>
--
God loved you so much that He gave His only son Jesus.  What have you  
done with God's gift?



_______________________________________________
Unsubscribe or switch delivery mode:
<http://www.realsoftware.com/support/listmanager/>

Search the archives:
<http://support.realsoftware.com/listarchives/lists.html>


<Prev in Thread] Current Thread [Next in Thread>