Vba 如果未将CopyMemory放入函数中,则会导致Excel崩溃
我在试验CopyMemory时遇到了一个奇怪的问题。我有一段复制自的代码,只有将其放入函数中才能工作: 我在开头说:Vba 如果未将CopyMemory放入函数中,则会导致Excel崩溃,vba,copymemory,Vba,Copymemory,我在试验CopyMemory时遇到了一个奇怪的问题。我有一段复制自的代码,只有将其放入函数中才能工作: 我在开头说: Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSource As Any, ByVal ByteLen As Long) 工作版本: 次弦试验 将str1设置为字符串 变暗pstr1为长PTR str1=PowerVB 调试。打印内存:0x;Mem_Read
Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSource As Any, ByVal ByteLen As Long)
工作版本:
次弦试验
将str1设置为字符串
变暗pstr1为长PTR
str1=PowerVB
调试。打印内存:0x;Mem_ReadHexpstr1-4,LenBstr1+6
端接头
公共函数Mem_ReadHexByVal Ptr为LongPtr,ByVal长度为String
Dim bBuffer作为字节,strBytes作为字符串,i作为长,ub作为长,b作为字节
ub=长度-1
雷迪姆·布弗鲁布
雷迪姆标准红细胞
CopyMemory bBuffer0,ByVal Ptr,长度
对于i=0到ub
b=bBufferi
strBytesi=IIfb<16,0和十六进制$b
下一个
Mem_ReadHex=联合红细胞,
端函数
此程序完美地打印出内存中字符串的整个布局。前4个字节表示长度,后接字符串内容,然后是2个字节的null:
Memory : 0x0E00000050006F00770065007200560042000000
现在,如果我将函数放入sub,它将崩溃:
次弦试验
将str1设置为字符串
将str2设置为字符串
变暗pstr1为长PTR
str1=PowerVB
CopyMemory pstr1,ByVal VarPtrstr1,8
Dim bBuffer作为字节,strBytes作为字符串
ub=LenBstr1+5
雷迪姆·布弗鲁布
雷迪姆标准红细胞
CopyMemory bBuffer0、ByVal pstr1-4、LenBstr1+6'额外4个字节的字符串长度和2个字节的空字符
对于i=0到ub
b=bBufferi
strBytesi=IIfb<16,0,&Hex$b'表示两个字节,如果值<16,则它只包含一个字节
接下来我
调试。打印JoinstrBytes,
端接头
我不明白。两个版本之间有什么区别?好的,我找到了修复程序:
CopyMemory bBuffer(0), ByVal pstr1 - 4, ub + 1
因为CopyMemory必须与第三个参数一样长,所以我不能使用LenBstr1+6,因为它可能是一个整数