Hi,
I guess I should have read your message better. When I use the
netserverenum api it returns a pointer to an array. I have to read each
element of the array individually. Here is an example. I hope this helps.
Imports System.Runtime.InteropServices
Module Module1
Structure Computer_info_101
Public Platform_ID As Integer
<MarshalAsAttribute(UnmanagedType.LPWStr)> Public Name As String
Public Version_Major As Integer
Public Version_Minor As Integer
Public Type As Integer
<MarshalAsAttribute(UnmanagedType.LPWStr)> Public Comment As String
End Structure
Declare Unicode Function NetServerEnum Lib "Netapi32.dll" _
(ByVal Servername As Integer, ByVal level As Integer, _
ByRef buffer As Integer, ByVal PrefMaxLen As Integer, _
ByRef EntriesRead As Integer, ByRef TotalEntries As Integer, _
ByVal ServerType As Integer, ByVal DomainName As String, _
ByRef ResumeHandle As Integer) As Integer
Declare Function NetApiBufferFree Lib "Netapi32.dll" _
(ByVal lpBuffer As Integer) As Integer
Private Const SV_TYPE_SERVER As Integer = &H2 ' All Servers
Sub Main()
Dim ComputerInfo As Computer_info_101
Dim i, MaxLenPref, level, ret, EntriesRead, TotalEntries, ResumeHandle As
Integer
Dim BufPtr As Integer
Dim iPtr As IntPtr
MaxLenPref = -1
level = 101
ret = NetServerEnum(0, level, BufPtr, MaxLenPref, EntriesRead, TotalEntries,
_
SV_TYPE_SERVER, "MSHOME", ResumeHandle) ' Replace MSHOME with your workgroup
name
If ret <> 0 Then
Console.WriteLine("An Error has occured")
Return
End If
' loop thru the entries
For i = 0 To EntriesRead - 1
' copy the stuff into our structure
Dim ptr As IntPtr = New IntPtr(BufPtr)
computerInfo = CType(Marshal.PtrToStructure(ptr,
GetType(Computer_info_101)), _
Computer_info_101)
BufPtr = BufPtr + Len(ComputerInfo)
Console.WriteLine(computerInfo.Name)
Next
NetApiBufferFree(BufPtr)
Console.Write("Press Enter to End")
Dim s As String = Console.ReadLine()
End Sub
End Module
Ken
--------------------------------
"Robin Tucker" <id*************************@reallyidont.com> wrote in
message news:bn*******************@news.demon.co.uk...
Yes, that was my first attempt, I wrote:
Marshal.PtrToStructure( myAudioPtr, theSoundByteArray)
Exception was: "The specified structure must be blittable or have layout
information."
I was under the impression that byte was blittable, as was the complex
type byte()?
"Ken Tucker [MVP]" <vb***@bellsouth.net> wrote in message
news:eU*************@TK2MSFTNGP10.phx.gbl... Hi,
Did you try Marshal.PtrToStructure?
Ken
------------------------
"Robin Tucker" <id*************************@reallyidont.com> wrote in
message news:bn*******************@news.demon.co.uk...
I need to marshal an IntPtr (which I've got from GlobalLock of an HGLOBAL) into a byte array. I know the size of the array required and I've got
a pointer to the blob, but I can't see how to copy the memory across.
Using Marshal.PtrStructure doesn't work - it says my byte() array is
not blittable! (byte is a blittable type however). Cannot use
Marshal.Copy, because that works the other way around (for mashalling to COM, not
from it).
Any ideas?
Dim theLocked As IntPtr
Try
' Find out how big the HGLOBAL allocation returned is
Dim theAudioSize As Integer = GlobalSize(hAudio)
' an array to store the WAV
Dim theSound As System.Byte()
' Resize the array
ReDim theSound(theAudioSize)
' Now, lock its buffer so we can load it in to our variable.
theLocked = GlobalLock(hAudio)
' Marshal "theLocked" into the array
??????????????????????
Catch Ex As Exception
' Whoops
Finally
Marshal.FreeHGlobal(theLocked)
End Try