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