VB中CopyMemory函数
2016-12-09 16:57
197 查看
vb中copymemory函数的使用挺耐人寻味的。copymemory的使用说明资料书上就一句“该函数用于将一块内存的数据从一个位置复制到另一个位置”。其参数数据类型destination as any,source as any。尽管是any型可理解成任一类型但是我看很多地方都说参数是指针类型的。因此起初我很不解,既然是指针型的参数我们往往直接将变量传递过去而不是变量的地址传递过去不是非法的吗?其实copymemory使用的灵活度是很大的,还是开始给出的定义最有说明性,将一块内存的数据从一个位置复制到另一个位置就是最好的解释。看下面几段程序有助于我们更好理解。
程序一:Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Sub Command1_Click()
Dim str1 As String
Dim str2 As String
str2 = "hello world"
CopyMemory str1, str2, 4
Text1.Text = str1
End Sub
这是候调试结果text1显示的内容完全就是str2复制过去的内容,即hello world。
如果改一句“copymemory str1,strptr(str2),4",这时候传递的是str2的指针,那么text1显示的结果就是h。
怎么样去理解?strptr(str2)得到的是一个指针毋庸置疑,即使函数参数是any型的因此该参数是合法的没问题,那么传递给str1,str1开始申明的是一个string型的变量,而不是一个string型的指针变量,因此传递参数的类型不一致为什么也是合法的,而且最终得到一个结果h。于是我上网找了vb中关于指针变量的定义,大家都说vb没有直接定义指针的。因此我想是不是str1放在copymemory中做参数接受指针变量的时候已经被强制转变成指针型变量了。
程序二:Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Sub Form_Load()
Dim i As Long
Dim k As Long
k = 5
i = VarPtr(k)
Debug.Print i
Debug.Print VarPtr(i)
CopyMemory i, 40000, 4
Debug.Print VarPtr(i)
Debug.Print i
Debug.Print k
Debug.Print "*******"
End Sub
调试结果:
1243232
1243236
1243236
40000
5
*******
说明变量i,k的地址是1243232,1243236。这一句:CopyMemory i, 40000, 4就是直接给变量i赋值40000而不是把地址值40000赋过去将变量i的地址改变成40000。如果想通过指针的方式修改k的初始值的话。
可以用下面这几句:
Dim i As Long
Dim k As Long
k = 5
i = VarPtr(k)
CopyMemory ByVal i, 40000, 4
Debug.Print k
Debug.Print "*******"
这时候就会发现k的值已经被修改成40000了。怎么样去理解?i 的值由i=varptr(k)一句变成k的地址值了,这时候用byval i表示的是该地址指向的内容,修改成40000后也就是k值被修改了。
VB中由于没有明确的指针定义,涉及到指针操作是通过API函数copymemory来进行,相对于C等语言来说形式上没有那么严格要求,因此外形上看很不明晰。
程序一:Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Sub Command1_Click()
Dim str1 As String
Dim str2 As String
str2 = "hello world"
CopyMemory str1, str2, 4
Text1.Text = str1
End Sub
这是候调试结果text1显示的内容完全就是str2复制过去的内容,即hello world。
如果改一句“copymemory str1,strptr(str2),4",这时候传递的是str2的指针,那么text1显示的结果就是h。
怎么样去理解?strptr(str2)得到的是一个指针毋庸置疑,即使函数参数是any型的因此该参数是合法的没问题,那么传递给str1,str1开始申明的是一个string型的变量,而不是一个string型的指针变量,因此传递参数的类型不一致为什么也是合法的,而且最终得到一个结果h。于是我上网找了vb中关于指针变量的定义,大家都说vb没有直接定义指针的。因此我想是不是str1放在copymemory中做参数接受指针变量的时候已经被强制转变成指针型变量了。
程序二:Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Sub Form_Load()
Dim i As Long
Dim k As Long
k = 5
i = VarPtr(k)
Debug.Print i
Debug.Print VarPtr(i)
CopyMemory i, 40000, 4
Debug.Print VarPtr(i)
Debug.Print i
Debug.Print k
Debug.Print "*******"
End Sub
调试结果:
1243232
1243236
1243236
40000
5
*******
说明变量i,k的地址是1243232,1243236。这一句:CopyMemory i, 40000, 4就是直接给变量i赋值40000而不是把地址值40000赋过去将变量i的地址改变成40000。如果想通过指针的方式修改k的初始值的话。
可以用下面这几句:
Dim i As Long
Dim k As Long
k = 5
i = VarPtr(k)
CopyMemory ByVal i, 40000, 4
Debug.Print k
Debug.Print "*******"
这时候就会发现k的值已经被修改成40000了。怎么样去理解?i 的值由i=varptr(k)一句变成k的地址值了,这时候用byval i表示的是该地址指向的内容,修改成40000后也就是k值被修改了。
VB中由于没有明确的指针定义,涉及到指针操作是通过API函数copymemory来进行,相对于C等语言来说形式上没有那么严格要求,因此外形上看很不明晰。
相关文章推荐
- VB程序员眼中的C# 7
- 用VB.NET定制Windows控件
- VB游戏外挂编程入门(三)
- 中英字符判断VB
- 一段精简的使用 ADODB.Stream 读写"大字段"的 VB 代码!
- VB隐藏进程
- VB 操作Excel,附软件图
- vb.net反射中如何将字符串转化为对象实例
- 用VB编写异步多线程下载程序
- 用这个类可以替代VB自带的Timer控件
- vb.net 中通过反射实现简单工厂模式
- 在VB中利用Nuget包使用SQLite数据库和Linq to SQLite
- [Visual Basic]vb调用winInet API接口post数据到指定的url
- 在vb.net中关于datagridview的一些操作
- 如何用VB实现Excel文件的自动合并
- VB程序的代码调试及错误处理
- VB中访问API函数之防错技巧
- VB.NET 数据快速导出到excel文件
- [转]C#(VB.NET)操作Windows自带的防火墙 之 添加/删除允许通过防火墙的例外程序
- VB.NET中的模块