’使用<StructLayout(LayoutKind.Sequential)>属性告诉net编译器:结构的元素在内存中按其出现的顺序排列 <StructLayout(LayoutKind.Sequential)> _ Public Structure DEFUDT_Test Public bytb As Byte
Public i32a As Int32 End Structure
Public Function fnGetIntptr1() As IntPtr ’取得一个4字节数组指针 Dim tabytTest(3) As Byte ’以下语句告诉net垃圾回收进程不对tabytTest进行处理,也就是说tabytTest占用的内存区域固定不变。 Dim thObject As GCHandle = GCHandle.Alloc(tabytTest, GCHandleType.Pinned) Dim tpObject As IntPtr = thObject.AddrOfPinnedObject() ’取得指向字节数组的指针
’取得一个指向32位内存数据的指针, ’由于使用gchandle取指针的方法只能对引用的对象有效, ’所以对如int32等值类型必须使用将其封装成为一个对象的方法以变为引用类型 Dim ti32Test As Object = Convert.ToInt32(0) ’以下语句告诉net垃圾回收进程不对ti32test进行处理,也就是说ti32Test的内存位置固定不变。 Dim thObject1 As GCHandle = GCHandle.Alloc(ti32Test, GCHandleType.Pinned) Dim tpObject1 As IntPtr = thObject1.AddrOfPinnedObject() ’取得ti32Test的首地址
Dim tudtTest1 As DEFUDT_Test ’由于结构是一种值类型变量,为保证指针申请方便,我们申请 ’取得一个和结构tudtTest1大小一致的字节数组指针,只要空间占用长度和结构一样就可以了 ’由于net在结构封装中会插入额外的数据位,所以一定要用sizeof方法得到结构在非托管使用时的实际大小 Dim tudtTest(Marshal.SizeOf(tudtTest1)) As Byte Dim thObject2 As GCHandle = GCHandle.Alloc(tudtTest, GCHandleType.Pinned) Dim tpObject2 As IntPtr = thObject2.AddrOfPinnedObject() ’取得指向结构的指针
’在这儿你可以写对指针处理的任意代码(在例2中会给予补充)……
’在使用完毕后一定要释放指针指向的内存块,让垃圾回收器可对这个内存块回收处理 If thObject.IsAllocated Then thObject.Free() End If If thObject1.IsAllocated Then thObject1.Free() End If If thObject2.IsAllocated Then thObject2.Free() End If End Function
文章评论(0条评论)
登录后参与讨论