首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果不放入函数中,CopyMemory将崩溃

如果不放入函数中,CopyMemory将崩溃
EN

Stack Overflow用户
提问于 2018-05-29 11:52:29
回答 1查看 1.1K关注 0票数 0

在试验CopyMemory时,我遇到了一个奇怪的问题。我有一段从Bytecomb复制过来的代码,只有当我把它放入一个函数中时才能正常工作:

我把这个放在开头:

代码语言:javascript
复制
Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSource As Any, ByVal ByteLen As Long)

工作版本:

代码语言:javascript
复制
Sub StringTest()
    Dim str1 As String
    Dim pstr1 As LongPtr

    str1 = "PowerVB"
    Debug.Print "Memory  : 0x"; Mem_ReadHex(pstr1 - 4, LenB(str1) + 6)

End Sub

Public Function Mem_ReadHex(ByVal Ptr As LongPtr, ByVal Length As Long) As String
    Dim bBuffer() As Byte, strBytes() As String, i As Long, ub As Long, b As Byte
    ub = Length - 1
    ReDim bBuffer(ub)
    ReDim strBytes(ub)
    CopyMemory bBuffer(0), ByVal Ptr, Length
    For i = 0 To ub
        b = bBuffer(i)
        strBytes(i) = IIf(b < 16, "0", "") & Hex$(b)
    Next
    Mem_ReadHex = Join(strBytes, "")
End Function

这个程序完美地打印出内存中字符串的整个布局(前4个字节表示长度,然后是字符串内容,然后是2个字节的null):

代码语言:javascript
复制
Memory  : 0x0E00000050006F00770065007200560042000000

现在,如果我把函数放到sub中,它就会崩溃:

代码语言:javascript
复制
Sub StringTest()
    Dim str1 As String
    Dim str2 As String
    Dim pstr1 As LongPtr

    str1 = "PowerVB"
    CopyMemory pstr1, ByVal VarPtr(str1), 8

    Dim bBuffer() As Byte, strBytes() As String
    ub = LenB(str1) + 5
    ReDim bBuffer(ub)
    ReDim strBytes(ub)
    CopyMemory bBuffer(0), ByVal pstr1 - 4, LenB(str1) + 6 'extra 4 bytes for string length, and 2 bytes of null characters
    For i = 0 To ub
        b = bBuffer(i)
        strBytes(i) = IIf(b < 16, "0", "") & Hex$(b) 'for 2 bytes, if the value < 16, then it only consists of one byte
    Next i
    Debug.Print Join(strBytes, "")
End Sub

我还是不明白。这两个版本有什么不同?

EN

回答 1

Stack Overflow用户

发布于 2018-05-29 12:00:48

好的,我找到了解决方法:

代码语言:javascript
复制
CopyMemory bBuffer(0), ByVal pstr1 - 4, ub + 1

因为CopyMemory必须接受long作为第三个参数,所以我不能使用LenB(str1) + 6,因为它可能是一个整数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50576069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档