VarPtr equivalent?

Merrion

Well-known member
Joined
Sep 29, 2001
Messages
265
Location
Dublin, Ireland
User Rank
*Experts*
The structure PRINTER_NOTIFY_OPTIONS_TYPE has a pointer to a variable length array of 16 bit integer flags as its last member. In VB-Classic I filled this by using the VarPtr keyword....how do I go about doing this in VB.Net?

i.e.
Code:
Private Structure PRINTER_NOTIFY_OPTIONS_TYPE
     Dim wType As Int16
     Dim wReserved0 As Int16
     Dim dwReserved1 As Int32
     Dim dwReserved2 As Int32
     Dim Count As Int32 \\Number of elements in the array
     Dim pFields As Int32 \\Pointer to the array
End Type

which is populated....
Code:
Dim arTypes(0) As Int16 
arTypes(0) = Job_Notify_Indexes.JOB_NOTIFY_FIELD_STATUS

With pTypeJob
    .wType = Printer_Notification_Types.JOB_NOTIFY_TYPE
    .Count = 1
    .pFields = ???? (was VarPtr(arTypes(0))
End With

Thanks in advance,
Duncan
 
There really isnt a .NET equivalent to VarPtr, in managed memory at least. What you have to do is allocate unmanaged memory using System.Runtime.InteropServices.AllocHGlobal(), which will then return an IntPtr. This is your variable pointer.
 
Is there not a Marshalling attribute which will pass a pointer to the variable rather than the variable itself?
 
**untested**`VarPtr equivalent

It may be possible thus:-

Code:
<StructLayout(LayoutKind.Sequential>_
Private Structure PRINTER_NOTIFY_OPTIONS_TYPE
   Dim wType As Int16
   Dim wReserved0 As Int16
   Dim dwReserved1 As Int32
   Dim dwReserved2 As Int32
   Dim Count As Int32
   <MarshalAs(UnmanagedType.LPArray)>Dim pFields() As Int16
End Structure

unfortunately Ive a whole heap more converting of old VB6 code to go beforte I can test this out.

Thanks in advance,
Duncan
 
Yeah, both ways will work. You can teach people shortcuts or teach them how it really works. Generally I like a mix of the two. Thats why I suggested AllocHGlobal().
 
In fact AllocHGlobal seems to be a better solution as I dont know the array size and the <MarshalAs()> will only get the first element in that case...
 
You could try this (sorry, its C# but should show what you need)

C#:
GCHandle p = GCHandle.Alloc(arTypes, GCHandleType.Pinned);
.pFields = p.AddrOfPinnedObject().ToInt32();
p.Free()

-ner
 
Last edited by a moderator:
Back
Top