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

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

  1. VB中 '&' 和 '+' 号的区别

    释义 &(Ampersand)是英语单字and之代表符号,亦可用作中文中的“和”.“与”之代表符号.这个符号源于拉丁文的et的连写. 可读做 ampersand,即 "and per ...

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

    Private Sub numDuration_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) ...

  3. VB 中Sub和Function的区别

    Sub可以理解为执行一个过车,一个操作. Function在执行完过后,还要返回一个结果. Sub:过程:Function:函数,可以带返回值. 语法: Sub SubName(参数1,参数2,... ...

  4. VB中的API详解

    一.API是什么? 这个我本来不想说的,不过也许你知道其它人不知道,这里为了照顾一下新手,不得不说些废话,请大家谅解. Win32 API即为Microsoft 32位平台的应用程序编程接口(Appl ...

  5. VB中 ByRef与ByVal区别

    函数调用的参数传递有"值传递"和"引用传递"两种传递方式.如果采用"值传递",在函数内部改变了参数的值,主调程序的对应变量的值不会改变:如果 ...

  6. 【转】VB中应用DDE

    动态数据交换(dde)是windows应用程序间通讯的基本方法之一,在动态数据交换的过程中,提供数据和服务的应用程序称为服务器,请求数据或服务的应用程序则称为客户. dde交谈是由客户程序启动的.如果 ...

  7. VB中的+与&符号的区别

    字符串运算符和字符串表达式 字符串运算符的作用是将两个字符串连接成一个字符串,经常形象的叫做连接符. 在VB中就提供了两种连接用的字符串运算符 “&”.“+” 例如  “VB”+“编程入门” ...

  8. C#中实现VB中的CreateObject方法

    经常看到有些VB的例子中直接用个CreateObject就可调用系统功能(大多是COM对象),像用户设定,网络设定等等.虽然C#中可以通过使用VB的命名空间的方法来调用CreateObject函数,但 ...

  9. 在VB中使用Linq To SQLite注意事项

    昨天使Linq To SQLite 支持VB,今天在VB中写了几条Linq语句,发现了几个问题: 1.在Linq To SQLite中的Linq语句查询后并不是得到的匿名数据类,而是将Linq转换为S ...

随机推荐

  1. CSS:如何学习 CSS?

    马上该转战互联网领域了,在此总结一下 CSS 学习的思路. 理解 CSS 的基本语法. 理解盒子模型. 理解文档流和定位. 理解浮动和清除. 理解各种 CSS 样式. 目前发现的最好的资源是:http ...

  2. 用drawRect以及CAReplicatorLayer绘制动态水波纹

    用drawRect以及CAReplicatorLayer绘制动态水波纹 大大简化了写水波纹效果的难度,你可以根据示例自己组装水波纹效果,本设计是几个工具组合在一起完成的效果, DrawRectObje ...

  3. Android之多种Bitmap效果

    1. 将图片变为圆角 2. 获取缩略图图片 3. LOMO特效 4. 旧时光特效 5. 暖意特效 6. 根据饱和度.色相.亮度调整图片 7. 添加图片外边框 8. 添加内边框 9. 创建一个缩放的图片 ...

  4. lftp命令

    lftp 是一个功能强大的下载工具,它支持访问文件的协议: ftp, ftps, http, https, hftp, fish.(其中ftps和https需要在编译的时候包含openssl库).ll ...

  5. QT 5.12 安装MinGW 7.3.0 32bit

    一.下载MinGW 7.3.0 32bit for QT 5.12 链接:https://pan.baidu.com/s/1IKDhvxEbKIgmWyQQhpdnTw提取码:ubxc 二.解压缩并将 ...

  6. lazarus编译X86/X64的程序

    一.以下两个包都得安装,不然 64 位 lazarus 编译不出 32 位的 DLL. lazarus-1.8.4-fpc-3.0.4-win64.exe lazarus-1.8.4-fpc-3.0. ...

  7. [转]Chart.js入门教程

    Chart.js是一个简单.面向对象.为设计者和开发者准备的图表绘制工具库. 相信大部分人都一样,看到一大筐用文本或者表格形式呈现的数据就头疼.因为这种呈现方式也太无聊了吧...而且这对于我们处理原始 ...

  8. IIS6 Gzip 网页GZIP压缩(转)

    现在主流浏览器基本都支持 Gzip 压缩,因此这也成了 WebServer 优化策略的一种常规手段.启用压缩后能有效减少网页传输数据大小,使得有限带宽能提供更多的请求,并在一定程度上提高了网页 &qu ...

  9. iOS开发-App Icons的尺寸大小

    每个App中Icon的尺寸大小是不一样的,如果你添加部分尺寸的Icon,有些没有添加,xCode会给出相应的警告,最近遇到一个问题就是A 76x76 app icon is required for ...

  10. MySQL配置版下载安装、配置与使用(win7x64)

    http://jingyan.baidu.com/article/597035521d5de28fc00740e6.html