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 清空

转载于:https://www.cnblogs.com/rosesmall/p/5553740.html

VB 中 copymemory的有关问题相关推荐

  1. VB中CopyMemory函数

    vb中copymemory函数的使用挺耐人寻味的.copymemory的使用说明资料书上就一句"该函数用于将一块内存的数据从一个位置复制到另一个位置".其参数数据类型destina ...

  2. vb中5种打开文件夹浏览框的方法总结(转)

    代码 众所周知,在vb中如果是打开某一个文件的话,非常简单,使用CommonDialog组件即可轻松完成,但是他只能选择文件,之后或许选取的文件路径,而如果想要浏览文件夹,就没这么方便了. 这里介绍3 ...

  3. 如何在VB中实现ActiveX控件的IobjectSafety接口

    如何在VB中实现ActiveX控件的IobjectSafety接口 ------------------------------------------------------------------ ...

  4. 在VB中如何让线程或进程在指定的CPU上运行

    代码如下: Option Explicit Private Declare Function WTSEnumerateProcesses Lib "wtsapi32.dll" Al ...

  5. VB中窗体模块、标准模块、类模块的区别

    VB的代码存储在模块中.在VB中提供了三种类型的模块:窗体模块.标准模块和类模块. 简单的应用程序可以只有一个窗体,所用的程序都驻留在窗体模块中,而当应用程序庞大复杂时,就要另外附加窗体.最终可能有几 ...

  6. VB中什么是类,类模块有什么作用

    一.什么是类? 用面向对象的编程思想来看,类就是存储数据同时给一组相关代码赋予协调功能的方式.类是面向对象编程的核心. VB最为人垢病的是它的面向对象特性.实际上VB是一种基于对象的开发工具.在VB中 ...

  7. vb中line的用法[转]

    绘制方框 可使用 Line 方法绘制并填充方框.下列示例画出一个方框,其左上角为 (500, 500),每边长为 1,000 : Line (500, 500)–Step(1000, 0) Line ...

  8. [转] Vb中FSO 对象的介绍

    在 VB 编程中经常需要和文件系统打交道,比如获取硬盘的剩余空间.判断文件夹或文件是否存在等.在VB 推出文件系统对象(File System Object)以前,完成这些功能需要调用 Windows ...

  9. VB中KeyCode常数用法

    可在代码中的任何地方用下列常数代替实际值: 常数 值 描述 vbKeyLButton 0x1 鼠标左键 vbKeyRButton 0x2 鼠标右键 vbKeyCancel 0x3 CANCEL 键 v ...

最新文章

  1. web在线聊天框滚动条自动在底部
  2. kali 树莓派 android,【原】树莓派安装KALI LINUX的手记
  3. formdata.append加多个值_呆哥数学每日一题 —— 多个最值函数混合向量
  4. JQuery 基础 || 目前 jQuery 有三个大版本||JQuery快速入门
  5. linux安装apache mysql tomcat
  6. java基础巩固笔记(6)-注解
  7. 洛谷P3845-球赛【离散化,贪心】
  8. layer 线上_LAYER
  9. gsensor 车辆碰撞算法_AEB安全模型(一)——基于碰撞时间的安全模型
  10. Application对象 简单的聊天室
  11. Linux运维面试题之--网页打开缓慢如何优化
  12. Java并发:五种线程安全类型、线程安全的实现、枚举类型
  13. OpenCV—积分图像
  14. python中如何导入数据包_如何在python中发送数据包?
  15. qt 日历类 不可输入当前日期之后的日期_UI设计组件时间选择器,日历设计从未如此简单!...
  16. 值得收藏!中国金融体系主要指标大全
  17. 泛微数字化督查督办平台:不见面也能高效落实工作、管理到位
  18. Sketch 70 下载 兼容macOS Big Sur系统
  19. 在线出境游竞品分析报告:携程、途牛和马蜂窝
  20. 【笔记】Android APP 上架 Google Play 采坑记之「应用签名证书」

热门文章

  1. Tcl/Tk 命令与C/C++的集成研究
  2. 说到“以用户为中心”这件事,Aruba很专业!
  3. ironpython是什么软件-IronPython
  4. BALLUFF BTL-P214040A0300
  5. 第80届奥斯卡完全获奖名单
  6. JS-----选项卡切换
  7. Surfaceflinger 合成流程
  8. HTML5 基础知识总结(全)
  9. vue 实现简易卡包效果
  10. C++ ODBC开发历程