VB 中 copymemory的有关问题
2016-06-02 17:11
423 查看
dim a() as long dim b() as byte copymemory 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 b b = 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 清空
相关文章推荐
- 没有找到msvbvm60.dll,因此这个应…
- 银河U1 VB 真空烧 + 银河北斗 + 锐科特小蓝火
- office2007给VBA增加数字签名保证宏安全
- 【原创】VB6.0应用程序安装包的生成(Setup Factory 9.0制作安装包的方法)
- 基于ffmpeg的内存数据UDP直播推流
- 【办公-WORD】vba 统一改变word文档所有的图片大小 然后导出成PDF
- 计算Spearman等级相关系数的VBA函数
- VB实现USB摄像头视频图像的监控、截图、录像
- 2016年4月编程语言排行榜 Visual Basic正渐行渐远
- VB Cells.find函数参数解释
- 安装vbundle
- excel中用当天日期命名工作表名vba
- 对反正弦函数的泰勒公式的转换加速
- VB 颜色RGB
- VB.net学习笔记(二十三)再识委托
- vbox丢失*MultiArch_amd64.msi或者*MultiArch_x86.msi重新制作
- VBA编程之放假倒计时器
- VAO,VBO绘图方式及GLSL传值
- VB 导出数据到Excel
- VB6利用正则表达式验证IP地址合法性