ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: hyefeifei

[原创] 简单讲讲Copymemory这个函数

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2016-6-6 23:20 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖已被收录到知识树中,索引项:Windows API应用
我也来盖楼了!楼主威武。

TA的精华主题

TA的得分主题

发表于 2016-6-7 07:14 来自手机 | 显示全部楼层
期待精彩的下一讲!

TA的精华主题

TA的得分主题

发表于 2016-6-7 09:46 | 显示全部楼层
非常精彩        
老师继续

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-6-7 13:40 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 hyefeifei 于 2016-6-7 14:14 编辑


  六、Copymemory函数

  1. 我搜了一下讲解这个函数的帖子,发现对这个函数的声明大体有两种:

  A: Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _

                                 (Destination As Any, Source As Any, ByVal Length As Long)

  B: Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory"  _  

                        (ByVal Destination As Long, ByVal Source As Long,ByVal Length As Long)  

  虽然使用B有其理由,但为避免混乱,这里使用A的声明方式,初学者只需把A声明拷贝到模块开头就可以使用Copymemory函数了,其他不必深究。

  2. 其实这个函数本身非常简单:

  Copymemory 参数2, 参数1, a

  记住:参数1 ,参数2 都是内存一块区域开头的地址,这个函数的意思是:把从参数1开头的地址,往后数a长度这么大的区域,复制到参数2开头的区域中。

  3. 见下图:这个函数无非是把0015F7C0(参数1)开头的区域,红框1处的内容,复制到以0015F7C4(参数2)开头的区域,即红框2处, 这里第3个参数为4,意即复制四个字节的内容。

  复制前

   未标题-1.jpg
 
  复制后

   123.jpg

  大家需要明白的两点是:

  ①既然参数1,参数2是内存的地址,而内存的地址是用一个长整形数表示的,所以,参数1,参数2都是long数据类型的。

  ②这个函数的2个参数,参数1、参数2必须传址(byref),不能传值(byval),除非这个值本身是一个内存地址。
 
  到此为止,大家可以看到,这个函数本身是很简单的,也容易理解。
 
  问题在于如何取得首位地址,待续……

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2016-6-7 15:09 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2016-6-7 16:57 | 显示全部楼层
问一个问题,那个查看地址的是用其他软件吗?具体方法是怎样的?

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-6-7 19:10 | 显示全部楼层
mao471023 发表于 2016-6-7 16:57
问一个问题,那个查看地址的是用其他软件吗?具体方法是怎样的?

Cheat Engine,玩游戏的人应该知道这个,使用很简单,搜下百度。

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-6-8 09:57 | 显示全部楼层
本帖最后由 hyefeifei 于 2016-6-8 11:27 编辑


  七、Copymemory II

  实在倒不出时间,做了张图,先贴在这里,大家先看看这张图,明白了这张图,也就基本明白了这个函数。

   Image 5.png

  待续……

TA的精华主题

TA的得分主题

发表于 2016-6-10 12:26 | 显示全部楼层
马上要更精彩了,不能停!
另外问下,copy s2,s1,4 意思是不是把s1的4个字节给s2,为什么debug.print 出来s2是abcde

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-6-10 17:52 | 显示全部楼层
本帖最后由 hyefeifei 于 2016-6-10 19:25 编辑


  Copymemory III

  1. 我先截取一块示意图,给大家讲一下示意图是什么意思:

  图A
  
   1.png

  图A完美解释了 s1=”abcde”是什么意思。

  当程序执行到dim s1 as string时,会在内存中划分一个四个字节大小的空间,这个空间第一个字节的地址如图是1000,我们以比喻的方式说,1000即是赵家的地址,或门牌号,此时赵家空着。

  当程序执行到s1=”abcde”时,程序会在内存中划分另一块区域,这个区域多大,我们后说,这个区域第一个字节的地址是1500,并且程序会把这个门牌号放进赵家(也就是byval s1的位置)。我们把1500看做是郑家的门牌号。

  也说是说我们按地址1000,进入了赵家,看到的不是abcde,看到的却是一个门牌号1500(byval s1),我们按这个门牌号指引去了郑家,才会看到abcde。

  2. copymemory 参数2,参数1,a

  我们可以把copymemory相像成一辆小车,参数1是告诉这辆车去谁家拿东西,参数2是告诉小车把东西拿到谁家,a是告诉拿多少东西。

  我们看截图:

  图B
  
   2.png

  如果我们要把s1的abcde复制到s2中,即是把郑家的abcde(圈1),放到王家(圈2)。

  郑家的地址是1500(byval s1),王家的地址是2500(byval s2),所以我们要给copymemory这辆小车这样下命令:

  Copymemory byval s2,byval s1,5

  完整程序如下:
  
  1.   Sub testn1()
  2.     Dim s1 As String
  3.     Dim s2 As String
  4.     s1 = "abcde"
  5.     s2 = String$(5, 0)
  6.     CopyMemory ByVal s2, ByVal s1, 5
  7.     Debug.Print s2
  8.   End Sub
复制代码

  如果你记得前面的内容,你可能会觉得疑惑,看一下前面的截图:

   3.png

  “abcde”这个字符串,在内存中应该是占了10个字节的内容啊(61 00 62 00 63 00 64 00 65 00)

   4.png

  待续……


您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-15 16:19 , Processed in 0.037556 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表