ENUMERATION
DU RESEAU AVEC WNET
Pour utiliser l'exemple,
il faut créer un nouveau projet sous VB et rajouter les fichiers
suivants :
WNet.frm
WNet.bas
Je précise qu'il
s'agit juste d'un exemple pour comprendre le concept général.
Si vous aussi, vous avez
un exemple d'utilisation de ces fonctions, n'hesitez pas à
me les envoyer.
Pour toutes questions
: webmaster@vbenreseau.com
WNet.frm
|
Private Sub
Command1_Click()
Dim nr As
NETRESOURCE
List1.Clear
doEnum 0, nr
End Sub
|
WNet.bas
Option Explicit
Public 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
Public 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
Public Declare
Function WNetEnumResource Lib
"mpr.dll" Alias _
"WNetEnumResourceA" ( _
ByVal hEnum As
Long, _
lpcCount As Long,
_
ByVal lpBuffer As
Long, _
lpBufferSize As Long)
As Long
Public Declare
Function WNetCloseEnum Lib
"mpr.dll" ( _
ByVal hEnum As
Long) As
Long
'RESOURCE ENUMERATION.
Public Const
RESOURCE_CONNECTED = &H1
Public Const
RESOURCE_GLOBALNET = &H2
Public Const
RESOURCE_REMEMBERED = &H3
Public Const
RESOURCETYPE_ANY = &H0
Public Const
RESOURCETYPE_DISK = &H1
Public Const
RESOURCETYPE_PRINT = &H2
Public Const
RESOURCETYPE_UNKNOWN = &HFFFF
Public Const
RESOURCEUSAGE_CONNECTABLE = &H1
Public Const
RESOURCEUSAGE_CONTAINER = &H2
Public Const
RESOURCEUSAGE_RESERVED = &H80000000
' Messages d'erreur
Public Const
ERROR_NOT_CONTAINER = 1207&
Public Const
ERROR_INVALID_PARAMETER = 87
Public Const
ERROR_NO_NETWORK = 1222&
Public Const
ERROR_EXTENDED_ERROR = 1208&
Public Const
ERROR_NO_MORE_ITEMS = 259&
Public Const
ERROR_MORE_DATA = 234
Public Const
ERROR_INVALID_HANDLE = 6&
Public Const
RESOURCEDISPLAYTYPE_DOMAIN As Long
= &H1&
Public Const
RESOURCEDISPLAYTYPE_GENERIC As Long
= &H0&
Public Const
RESOURCEDISPLAYTYPE_SERVER As Long
= &H2&
Public Const
RESOURCEDISPLAYTYPE_SHARE = &H3
Public 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 Long
Public Declare
Function GlobalFree Lib
"KERNEL32" ( _
ByVal hMem As
Long) As
Long
Public 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
Public 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
Public Function
doEnum(level As Integer,
nr As NETRESOURCE) As
Integer
Dim rc As
Long
Dim stype As
String
Dim scont As
String
Dim hEnum As
Long, lpBuff As
Long
Dim cbBuff As
Long, cCount As
Long
Dim p As
Long
Dim i As
Integer
rc = WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, nr,
hEnum)
If rc <> 0 Then
MsgBox "Error: " & Err.LastDllError, vbOKOnly, "WNetEnumResources"
Exit Function
End If
Do While
1
cbBuff = 1000
cCount = &HFFFFFFFF
lpBuff = GlobalAlloc(GPTR, cbBuff)
rc = WNetEnumResource(hEnum, cCount, lpBuff, cbBuff)
If rc <> 0 Then
Exit Do
End If
p = lpBuff
For i = 1 To
cCount
CopyMemory nr, ByVal p, LenB(nr)
Select Case
nr.dwDisplayType
Case RESOURCEDISPLAYTYPE_DOMAIN
stype = "domaine"
Case RESOURCEDISPLAYTYPE_GENERIC
stype = "generic"
Case RESOURCEDISPLAYTYPE_SERVER:
stype = "serveur"
Case RESOURCEDISPLAYTYPE_SHARE:
stype = "partage"
Case Else
stype = "inconnu"
End Select
If nr.dwUsage And
RESOURCEUSAGE_CONTAINER Then
scont = "recipient"
Else
scont = ""
End If
Form1.List1.AddItem stype & vbTab & scont & vbTab & level &_
vbTab & PointerToString(nr.lpLocalName) & _
vbTab & PointerToString(nr.lpRemoteName)
If nr.dwUsage And
RESOURCEUSAGE_CONTAINER Then
doEnum level + 1, nr
End If
p = p + LenB(nr)
Next i
Loop
If rc <> ERROR_NO_MORE_ITEMS Then
MsgBox "Error: " & Err.LastDllError, vbOKOnly, "WNetEnumResources"
End If
WNetCloseEnum (hEnum)
End Function |
|