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 清空
转载于:https://www.cnblogs.com/rosesmall/p/5553740.html
VB 中 copymemory的有关问题相关推荐
- VB中CopyMemory函数
vb中copymemory函数的使用挺耐人寻味的.copymemory的使用说明资料书上就一句"该函数用于将一块内存的数据从一个位置复制到另一个位置".其参数数据类型destina ...
- vb中5种打开文件夹浏览框的方法总结(转)
代码 众所周知,在vb中如果是打开某一个文件的话,非常简单,使用CommonDialog组件即可轻松完成,但是他只能选择文件,之后或许选取的文件路径,而如果想要浏览文件夹,就没这么方便了. 这里介绍3 ...
- 如何在VB中实现ActiveX控件的IobjectSafety接口
如何在VB中实现ActiveX控件的IobjectSafety接口 ------------------------------------------------------------------ ...
- 在VB中如何让线程或进程在指定的CPU上运行
代码如下: Option Explicit Private Declare Function WTSEnumerateProcesses Lib "wtsapi32.dll" Al ...
- VB中窗体模块、标准模块、类模块的区别
VB的代码存储在模块中.在VB中提供了三种类型的模块:窗体模块.标准模块和类模块. 简单的应用程序可以只有一个窗体,所用的程序都驻留在窗体模块中,而当应用程序庞大复杂时,就要另外附加窗体.最终可能有几 ...
- VB中什么是类,类模块有什么作用
一.什么是类? 用面向对象的编程思想来看,类就是存储数据同时给一组相关代码赋予协调功能的方式.类是面向对象编程的核心. VB最为人垢病的是它的面向对象特性.实际上VB是一种基于对象的开发工具.在VB中 ...
- vb中line的用法[转]
绘制方框 可使用 Line 方法绘制并填充方框.下列示例画出一个方框,其左上角为 (500, 500),每边长为 1,000 : Line (500, 500)–Step(1000, 0) Line ...
- [转] Vb中FSO 对象的介绍
在 VB 编程中经常需要和文件系统打交道,比如获取硬盘的剩余空间.判断文件夹或文件是否存在等.在VB 推出文件系统对象(File System Object)以前,完成这些功能需要调用 Windows ...
- VB中KeyCode常数用法
可在代码中的任何地方用下列常数代替实际值: 常数 值 描述 vbKeyLButton 0x1 鼠标左键 vbKeyRButton 0x2 鼠标右键 vbKeyCancel 0x3 CANCEL 键 v ...
最新文章
- web在线聊天框滚动条自动在底部
- kali 树莓派 android,【原】树莓派安装KALI LINUX的手记
- formdata.append加多个值_呆哥数学每日一题 —— 多个最值函数混合向量
- JQuery 基础 || 目前 jQuery 有三个大版本||JQuery快速入门
- linux安装apache mysql tomcat
- java基础巩固笔记(6)-注解
- 洛谷P3845-球赛【离散化,贪心】
- layer 线上_LAYER
- gsensor 车辆碰撞算法_AEB安全模型(一)——基于碰撞时间的安全模型
- Application对象 简单的聊天室
- Linux运维面试题之--网页打开缓慢如何优化
- Java并发:五种线程安全类型、线程安全的实现、枚举类型
- OpenCV—积分图像
- python中如何导入数据包_如何在python中发送数据包?
- qt 日历类 不可输入当前日期之后的日期_UI设计组件时间选择器,日历设计从未如此简单!...
- 值得收藏!中国金融体系主要指标大全
- 泛微数字化督查督办平台:不见面也能高效落实工作、管理到位
- Sketch 70 下载 兼容macOS Big Sur系统
- 在线出境游竞品分析报告:携程、途牛和马蜂窝
- 【笔记】Android APP 上架 Google Play 采坑记之「应用签名证书」