莆仙生活网
当前位置: 莆仙生活网 > 知识库 >

copymemory

时间:2024-05-04 14:56:21 编辑:莆仙君

Excel 求助CopyMemory的使用方法

这个函数的声明大体有两种:  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,意即复制四个字节的内容。

VB6怎么使用copymemory直接复制数组?

CopyMemory()函数功能描述:将一块内存的数据从一个位置复制到另一个位置。函数原型VOID CopyMemory(PVOID Destination,CONST VOID *Source,SIZE_T Length);参数Destination  要复制内存块的目的地址。Source  要复制内存块的源地址。Length  指定要复制内存块的大小,单位为字节返回值  该函数为VOID型,没有返回值。备注  如果目的块与源块有交叠,结果是不可预料的,使用MoveMemory可以解决这个问题。注意一点CopyMemory和MoveMemory不过是RtlMoveMemory的一个别名。编程语言特点1.可视化Visual basic是可视化的程序设计语言,开发人员只需要按照设计要求对屏幕进行布局,用集成开发环境来直接拖和画出各个菜单、按钮、滚动条、窗口等不同类型的对象。2.面向对象在visual basic 中,窗体及控件都称为对象,有这些对象构成了用户界面,visual basic是面向对象的程序设计语言,它是将代码和数据结合在每个对象中,用户只需要了解每个对象能完成什么任务,不必知道对象是如何工作的,而程序设计人员只要编写实现程序功能的那部分代码,这样大大提高了程序设计的效率,但是visual basic里面没有多态等面向对象的特性,所以有人称visual basic是准面向对象程序设计语言。3.事件驱动Visual basic通过事件来执行对象的操作,一个对象可能会产生多个事件,每个事件都可以通过一段程序来响应,而各个事件之间却不一定有联系,这样的应用程序代码较短,使程序既易于编写又易于维护。4.沿用结构化的程序设计的思想Visual basic具有丰富的数据类型,众多的函数,并采 用了结构化的程序 设 计方法,简单易学。5.易学易用的集成开发环境Visual basic提供了易学易用的集成开发环境,在该开发环境中,用户可设计用户界面,编写代码,调试程序,直至把应用程序编译成可执行文件使其直接在windows环境下运行6.支持多种数据库的访问采用了对象的链接与嵌入(OLE,Object linking and embedding)技术可以很方便的开发出集声音、图像、动画、子处理、web等对象于一体的应用程序。最新版本Visual basic 6.0(简称VB6)所提供的开发环境与Windows 9x,Windows NT4.0或Windows2000具有完全一致的界面,使用更方便,其代码效率已达到Visual C++的水平.在面向对象程序设计方面,6.0版的VB全面支持面向对象的程序设计,包括数据抽象,封装,对象与属性,类与成员,继承和多态等。Visual Basic6.0包括三种版本即学习版,专业版和企业版,这些版本是在相同的基础上建立起来的,因此大多数应用程序可以在三种版本中通用。Visual Basic 6.0 是用来创建高性能的企业应用程序及基于 Web的应用程序的最有效工具。Visual Basic 6.0 使开发者得以创建驻留在客户或服务器上或运行在分布式n-层环境里的强壮应用程序。Visual Basic 6.0 这个快速应用开发工具既可以作为一个单独的产品也可以作为 Visual Studio 6.0 套件的一个组成部分。

DELPHI CopyMemory问题

调用CopyMemory之前,如果已经为指针分配了内存,就不需要调用GetMem。举个例子:
var
s1, s2: string;
begin
s1 := '123';
s2 := 'abc';
CopyMemory(@s2[1], @s1[1], 3);
{s2 = '123'}
end;
又如:
var
b: Byte;
i: Integer;
begin
b := 0;
i := 511;
CopyMemory(@i, @b, 1);
{i的低8位被置0,i = 256}
end;


请教copymemory问题

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


如何将十六进制转换成浮点数

十六进制转换成浮点数先要将十六进制数的整数部分和小数部分分别转换成十进制数,再加以合并,并保留浮点数精度。十六进制数转换成十进制数整数的基本做法是使用"按权相加"法,把十六进制数首先写成加权系数展开式,然后按十进制加法规则求和。十六进制小数转换成十进制小数采用"乘10取整,顺序排列"法。用10乘十六进制小数,可以得到积,将积的整数部分取出,再用2乘余下的小数部分,如此进行,直到积中的小数部分为零,或者达到所要求的精度为止。例如十六进制数AF.3912转换成十进制数为AF.3912=(10*16^1+15*16^0).(2*16^-0+2*16^-1+2*16^-2+9*16^-3)=175.2229。浮点数的精度为小数点后2位,即十六进制数AF.3912=十进制数175.22。扩展资料:十六进制数的基数是16,采用的数码是0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。其中A-F分别表示十进制数字10-15.十六进制数的技术规则是“逢十六进一”,它的各位的权是以16的N次方标识的。十六进制数的加减法的进/借位规则为:借一当十六,逢十六进一。 十六进制数同二进制数及十进制数一样,也可以写成展开式的形式。

如何转换浮点数的二进制格式为十进制

二进制的小数转换为十进制主要是乘以2的负次方,从小数点后开始,依次乘以2的负一次方,2的负二次方,2的负三次方等。例如:二进制数0.001转换为十进制。第一位为0,则0*1/2,即0乘以2负一次方。第二位为0,则0*1/4,即0乘以2的负二次方。第三位为1,则1*1/8,即1乘以2的负三次方。各个位上乘完之后,相加,0*1/2+0*1/4+1*1/8得十进制的0.125扩展资料:二进制转换为十进制:方法:“按权展开求和”,该方法的具体步骤是先将二迸制的数写成加权系数展开式,而后根据十进制的加法规则进行求和。规律:个位上的数字的次数是0,十位上的数字的次数是1,......,依次递增,而十分位的数字的次数是-1,百分位上数字的次数是-2,......,依次递减。十进制转换为二进制:一个十进制数转换为二进制数要分整数部分和小数部分分别转换,最后再组合到一起。整数部分采用 "除2取余,逆序排列"法。具体做法是:用2整除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为小于1时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来 。小数部分要使用“乘 2 取整法”。即用十进制的小数乘以 2 并取走结果的整数(必是 0 或 1),然后再用剩下的小数重复刚才的步骤,直到剩余的小数为 0 时停止,最后将每次得到的整数部分按先后顺序从左到右排列即得到所对应二进制小数。通用进制转换:不同进制之间的转换本质就是确定各个不同权值位置上的数码。转换正整数的进制的有一个简单算法,就是通过用目标基数作长除法;余数给出从最低位开始的“数字”。参考资料:百度百科-二进制