Подскажите пожалуйста в чем может быть проблема при обращении к NetServerEnum.
Код честно скопирован множество раз с разных сайтов и из msdn.
Как только доходит до строки обращения к внешней функции (выделено красным цветом) возникает ошибка:
An unhandled exception of type 'System.NullReferenceException' occurred in Test.exe
Additional information: Object reference not set to an instance of an object.
По честному отсмотрел кучу постов о том, как получить список машин в домене, но такой проблемы ни у кого не возникало.
Код прилагается, спасибо за помощь
Option Explicit Off
Imports System.Runtime.InteropServices
Public Class Form1
Inherits System.Windows.Forms.Form
Const ERROR_SUCCESS = 0
Const ERROR_MORE_DATA = 234
Const SV_TYPE_WORKSTATION = &H8
Const SIZE_SI_101 = 24
Public Structure SERVER_INFO_100
Public sv100_platform_id As Long
Public sv100_name As Long
End Structure
Public Enum SV_101_TYPES
SV_TYPE_WORKSTATION = &H1
SV_TYPE_SERVER = &H2
SV_TYPE_ALL = &H0
End Enum
Public Structure SERVER_INFO_101
Public dwPlatformId As Long
Public lpszServerName As String
Public dwVersionMajor As Long
Public dwVersionMinor As Long
Public dwType As Long
Public lpszComment As Long
End Structure
Declare Auto Function NetServerEnum Lib "netapi32.dll" (ByVal servername As String, _
ByVal level As Long, _
ByRef buffer As Long, _
ByVal prefmaxlen As Long, _
ByRef entriesread As Long, _
ByRef totalentries As Long, _
ByVal ByValservertype As System.Runtime.InteropServices.UnmanagedType, _
ByVal domain As String, _
ByRef resumehandle As Long) As Long
Declare Auto Function NetApiBufferFree Lib "netapi32.dll" ( _
ByVal BufPtr As Long) As Long
Declare Sub RtlMoveMemory Lib "KERNEL32" ( _
ByRef hpvDest As SERVER_INFO_101, _
ByVal hpvSource As Long, _
ByVal cbCopy As Long)
Declare Function lstrcpyW Lib "KERNEL32" ( _
ByVal lpszDest As String, _
ByVal lpszSrc As Long) As Long
Private Function PointerToString(ByVal lpszString As Long) As String
Dim intPos As Integer
Dim lpszStr2 As String
Dim nRes As Long
Dim lpszStr1 As New String("*"c, 1000)
nRes = lstrcpyW(lpszStr1, lpszString)
lpszStr2 = lpszStr1
intPos = InStr(lpszStr2, Chr(0)) — 1
PointerToString = Microsoft.VisualBasic.Left(lpszStr2, intPos)
End Function
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim pszTemp As String
Dim pszServer As String
Dim pszDomain As String
Dim nLevel As Long, i As Long, BufPtr As Long, TempBufPtr As Long
Dim nPrefMaxLen As Long, nEntriesRead As Long, nTotalEntries As Long
Dim nServerType As Long, nResumeHandle As Long, nRes As Long
Dim ServerInfo As SERVER_INFO_101
Dim sWSName As String
pszServer = Nothing
pszDomain = Nothing
nLevel = 101
BufPtr = 0
nPrefMaxLen = -1
nEntriesRead = 0
nTotalEntries = 0
nServerType = SV_TYPE_WORKSTATION
nResumeHandle = IntPtr.Zero.ToInt32
Do
nRes = NetServerEnum("", _
nLevel, _
BufPtr, _
nPrefMaxLen, _
nEntriesRead, _
nTotalEntries, _
SV_101_TYPES.SV_TYPE_SERVER, _
"", _
nResumeHandle)
If ((nRes = ERROR_SUCCESS) Or (nRes = ERROR_MORE_DATA)) And _
(nEntriesRead > 0) Then
TempBufPtr = BufPtr
For i = 1 To nEntriesRead
RtlMoveMemory(ServerInfo, TempBufPtr, SIZE_SI_101)
sWSName = PointerToString(ServerInfo.lpszServerName)
TempBufPtr = TempBufPtr + SIZE_SI_101
Next i
Else
MsgBox("NetServerEnum failed: " & nRes)
End If
NetApiBufferFree(BufPtr)
Loop While nEntriesRead < nTotalEntries
End Sub
End Class