VB.NET 指针

在.NET中,对指针指向数据的存储函数都封装在marshal类中,主要的函数包括:Copy、PtrToStringUni 、PtrToStructure 、OffsetOf、WriteXXX,RreadXXX等。

‘使用<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 GCHandleGCHandle = 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 GCHandleGCHandle = 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
GCHandleGCHandle = 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

上例中VB.NET指针流程处理可以归纳为:
1、定义一个具有合适内存长度的引用变量(关于引用变量和值变量的差异可以参观VB.NET的书籍)
2、使用GCHandle.Alloc方法将变量的内存区域固定下来。
3、使用GCHandle对象的AddrOfPinnedObject取得该内存区域的首地址并赋值给指针变量.
4、对指针进行操作
5、使用GCHandle对象的free方法释放指针指向的内存区域以便NET垃圾回收器可以回收这个内存空间
6、VB.NET指针所指向数据的存取

在.NET中,对指针指向数据的存储函数都封装在marshal类中,主要的函数包括:Copy、PtrToStringUni 、PtrToStructure
、OffsetOf、WriteXXX,RreadXXX等,其中WriteXXX的表示向指针所表示的地址中写入XXX类型的数据,而ReadXXX中作用就是将VB.NET指针所在地址的数据以XXX类型方式读出。

时间: 2024-07-30 06:35:36

VB.NET 指针的相关文章

VB鼠标指针

vbDefault 0 (缺省值)形状由对象决定. VbArrow 1 箭头. VbCrosshair 2 十字线(crosshair 指针). VbIbeam 3 I 型 VbIconPointer 4 图标(矩形内的小矩形). VbSizePointer 5 尺寸线(指向东.南.西和北四方向的箭头). VbSizeNESW 6 右上-左下尺寸线(指向东北和西南方向的双箭头). VbSizeNS 7 垂-直尺寸线(指向南和北的双箭头). VbSizeNWSE 8 左上-右下尺寸线(指向东南和西

VB程序逆向反汇编常见的函数(修改版)

VB程序逆向常用的函数 1) 数据类型转换: a) __vbaI2Str    将一个字符串转为8 位(1个字节)的数值形式(范围在 0 至 255 之间) 或2 个字节的数值形式(范围在 -32,768 到 32,767 之间). b)__vbaI4Str   将一个字符串转为长整型(4个字节)的数值形式(范围从-2,147,483,6482,147,483,647) c)__vbar4Str  将一个字符串转为单精度单精度浮点型(4个字节)的数值形式 d)__vbar8Str   将一个字符

VB断点大全

MultiByteToWideChar, ANSI字符串转换成Unicode字符串WideCharToMultiByte, Unicode字符串转换成ANSI字符串 //--------------------------------------------------rtcR8ValFromBstr //把字符串转换成浮点数 rtcMsgBox 显示一信息对话框 rtcBeep //让扬声器叫唤 rtcGetPresentDate //取得当前日期 //--------------------

OD调试程序常用断点大全

常用断点 拦截窗口: bp CreateWindow 创建窗口 bp CreateWindowEx(A) 创建窗口 bp ShowWindow 显示窗口 bp UpdateWindow 更新窗口 bp GetWindowText(A) 获取窗口文本 拦截消息框: bp MessageBox(A) 创建消息框 bp MessageBoxExA 创建消息框 bp MessageBoxIndirect(A) 创建定制消息框 bp IsDialogMessageW 拦截警告声: bp MessageBe

OD调试程序经常使用断点大全

经常使用断点 拦截窗体: bp CreateWindow 创建窗体 bp CreateWindowEx(A) 创建窗体 bp ShowWindow 显示窗体 bp UpdateWindow 更新窗体 bp GetWindowText(A) 获取窗体文本 拦截消息框: bp MessageBox(A) 创建消息框 bp MessageBoxExA 创建消息框 bp MessageBoxIndirect(A) 创建定制消息框 bp IsDialogMessageW 拦截警告声: bp Message

汇编命令及OD常用命令及断点设置

汇编32位CPU所含有的寄存器有: 4个数据寄存器(EAX.EBX.ECX和EDX)对低16位数据的存取,不会影响高16位的数据.这些低16位寄存器分别命名为:AX.BX.CX和DX,它和先前的CPU中的寄存器相一致.4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL.BX:BH-BL.CX:CH-CL.DX:DH-DL),每个寄存器都有自己的名称,可独立存取. 寄存器EAX通常称为累加器(Accumulator)     用累加器进行的操作可能需要更少时间.可用于乘. 除.输入/

VB.NET 内存指针和非托管内存的应用

介绍 Visual Basic 从来不像在C或C++里一样灵活的操纵指针和原始内存.然而利用.NET框架中的structures 和 classes,可以做许多类似的事情.它们包括 IntPtr,   Marshal 以及 GCHandle. 这些structures(结构) 和classes(类) 允许你在托管和非托管环境中进行交互.本文中将向您展示如何使用这些structures 和 classes 去完成指针和内存的操作. 关于 IntPtr 结构 IntPtr  结构的行为像一个整型指针

VB指针操作和消息钩子

二.VB怎么用指针 要想弄明白VB怎么使用指针,就必须要弄明白两件事,第一,如何取得数组的指针,第二,如何将指针所指向的数组取出来.     A.在讲解这两个问题之前,我们需要了解几个问题:     1.VB的数组与C++的数组的区别 有可能,大家现在认为VB的数组和C++的数组没有任何区别,都是内存中的一段地址而已,其实不然. C++中是真的数组,真的是一段地址,而且,当你的指针访问超出了数组的范围,也没人理你,只是很容易导致系统崩溃而已. 而VB数组其实是一个结构体,在这个结构体中包含了关于

获取VB类模块成员函数指针(转)

最近在做一些VB6.VBA的项目,被如何获取类模块中的函数指针这个问题所困扰,收集整理后,有2分资料值得收藏,特将关键部分留存,以备后续查找. 参照连接1:http://www.cnblogs.com/pctgl/articles/1352916.html 参照连接2:http://blog.csdn.net/lyserver/article/details/4224676 以下是链接1中的部分内容: 1. 函数地址 = GetClassProcAddress ( 指定为哪个函数 [上面解释],