VB 中 copymemory的有关问题

dim a() as long dim b() as bytecopymemory b(0),byval "1234",4 copymemory byval  varptr(a(0)),1234,4

在 VB 中处于安全考虑,不能直接访问内存,但你可以使用 CopyMemory(RtlMoveMemory) 的 API 来复制指定区域的内存,其具体声明如下:Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)其中,Destination 是指向复制目标的指针,可以直接指定为某个变量或是数组(如果是数组应使用 myArray(0) 或是 myArray(n) 来指定覆盖的起点,不能直接使用 myArray),或是使用 ByVal 关键字加内存地址Source 是复制源的指针,用法与上面一样Length 是复制的长度,以字节为单位。

VB 6 中没有公开的三个函数:VarPtr,StrPtr,ObjPtr它们分别返回变量、字符串、对象的指针(就是内存地址)

因此,在执行:copymemory b(0),byval "1234",4 时,VB 会先在内存中划出一块儿区域,用于保存值为 "1234" 的字符串,然后把这个字符串的指针传给 CopyMemory,CopyMemory 把内存中刚才保存字符串数据的地址处的数据复制到数组 b 中,从 b(0) 开始覆盖,覆盖 4 个字节

VB 6 在调用 API 时,字符串一般是按值(ByVal)传递,在传递时以 ANSI 编码。也就是说,上面那句代码等价于(为了安全性,我个人推荐下面这种做法):Erase bb = StrConv("1234", vbFromUnicode)

而copymemory byval  varptr(a(0)),1234,4 其实就是CopyMemory a(0),1234,4在执行时,VB 会先在内存中划出 2 个字节(1234 等价于 1234% 或是 CInt(1234))用于保存值为 1234 的 Integer,然后在执行 CopyMemory 时,把内存中刚才保存有 1234 处的数据复制到数组 b 中,从 a(0) 开始覆盖,覆盖 4 个字节。问题是,你把指针给人家时,只在对应的位置划了 2 个字节,你却要人家从你给的位置读 4 个字节……由于后两个字节没有被分配,因此可能会返回一个任意值,不排除崩溃的可能,而且还是你的程序带着开发环境 IDE 一块儿崩溃。估计你本来应该这么写(我觉得 byval varptr(...) 累赘了):CopyMemory a(0),1234&,4这样,划出来的就是 4 个字节(Long)了。可是,如果是这样,那你还不如用:a(0) = 1234又方便,又安全……

还有,CopyMemory 只负责复制,不负责分配内存。因此你在把 a、b 数组当成复制覆盖的目标之前,至少需要分配一下内存吧(若你是在问题中省略了就算了……)例如:ReDim a(0)    ‘4 x 1 = 4 字节ReDim b(3)    ‘1 x 4 = 4 字节但如果你准备使用b = StrConv("1234", vbFromUnicode)这样的代码,则 b 一定要是空的,如果不是,则需要使用 Erase 清空
时间: 2024-10-29 03:38:52

VB 中 copymemory的有关问题的相关文章

VB中 ByRef与ByVal区别

函数调用的参数传递有"值传递"和"引用传递"两种传递方式.如果采用"值传递",在函数内部改变了参数的值,主调程序的对应变量的值不会改变:如果采用"引用传递",在函数内部改变了参数的值,主调函数对应变量的值也会发生相应的改变."值传递"的实质传递一个变量的"值拷贝","引用传递"的实质是传递一个变量的"地址".在VB中ByRef表示引用传递,ByVa

具体解释VB中连接access数据库的几种方法

在VB中,连接ACCESS数据库的方法主要有以下三种 使用ADO对象,通过编写代码訪问数据库 Connection 对象 ODBC数据源 使用ADO Data 控件高速创建数据库连接 有三种连接方法 Data Link文件 使用ODBC数据源名称 使用连接字符串 使用数据环境设计器创建数据库连接 首先加入环境引用. 然后找到数据源进行连接 不管是哪一种连接,都是先有一个路径,通向要连接的数据源,和数据源建立关系,在连接.就好比从北京到上海,能够做汽车,能够做火车,还能够做飞机,汽车走快速,火车走

VB中DateDiff 函数解释

VB中DateDiff 函数使用方法 DateDiff (interval, Date1 , Date2[,firstweekofyear[,firstweekofyear]]) 返回一个Variant(long) 的值,表示两个指定日期间的时间间隔数目 interval:设定两个日期之间的期间计算之单位.譬如 >interval="m" 表示计算的单位为月. >interval 的设定值如: yyyy > Year 年 q Quarter 季 m Month 月 d

VB 中Sub和Function的区别

Sub可以理解为执行一个过车,一个操作. Function在执行完过后,还要返回一个结果. Sub:过程:Function:函数,可以带返回值. 语法: Sub SubName(参数1,参数2,...) ... End Sub Function FunctionName(参数1,参数2,...) ... FunctionName=返回值 End Function 调用时: Sub 只能用: SubName(参数1,参数2,...)              变量=FunctionName(参数1

VB 中 NumericUpDown 控件 如何为手动输入设定触发事件

Private Sub numDuration_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles numDuration.KeyUp numDuration.Value = numDuration.Value End Sub Private Sub numDuration_ValueChanged(ByVal sender As Object, ByVal e As System

vb中数组的初始化

vb中数组的初始化 问题: 计划使用数组存储以下值: "零分,班序,年名,序,组名,级名,总分3,总分5,总分9,总序,语序,数序,英序,物序,化序,政序,历序,地序,生序" 方法: 在vb中数组初始化比较麻烦 1.标准做法:     dim field(19) as string '需要手工计算下标上限     fiels(0)="零分" '逐行赋值     field(1)="班序"     ...     field(18)="生

vb中的封装,继承,多态的实现。

        VB中引入了面向对象的编程机制,使该语言具有面向对象语言的封装.继承和多态三个主要的特征,极大地提高了应用程序的开发效率.但是大多数面向对象的设计语言都通过继承来提供多态的,而vb是通过多从ActiveX接口来提供多态的.         在上一篇文章中我简单的描述了vb中的类与对象,类,对象,对于继承与多态来说是比不可少的,下面我谈一下vb中封装,继承,多态的实现.         1. 封装         从表面意思上看就是将某些东西给打包封起来,vb中的封装与这个意思大致

VB中的排序问题 15个

首次接触VB,以下就先进行VB中的排序问题                   Dim a As Integer Dim b As Integer Dim c As Integer Dim d As Integer Dim e As Integer Dim f As Integer Dim g As Integer Dim h As Integer Dim i As Integer Dim j As Integer Dim k As Integer Dim l As Integer Dim m

VB中的冒号——bug

关于VB中的冒号,给许多人的印象都是:“一行可书写几句语句”.这么说是对的,但是有一种情况是不对的,那就是在条件语句中.这也是做一个VB项目升级的时候遇到,因为这个问题我查了好长时间程序,一直在找VB的中的效果是如何实现的呢?现在发现那是一个非常大的bug.我觉得这不是程序员的错误,应该是VB语法上的漏洞.如果有理解不对的地方欢迎大家指教. 看一个例子吧: 1 If Row1 = -1 Then Row1 = 0: If Row2 = -1 Then Row2 = .MaxRows 我们一般的理