Понять RtlMoveMemory - PullRequest
       3

Понять RtlMoveMemory

0 голосов
/ 19 февраля 2019

Спасибо, что прочитали это.Я пытаюсь понять это из любопытства.Я скопировал этот код откуда-то, попробуйте возиться, но он не работает, как ожидалось.Я ожидаю, что Debug.Print c вернет 4, но оно останется 3. Я подозреваю, что ошибка может быть в типе данных, но не уверен, так как нет всплывающего окна ошибки.

Option Explicit

#If VBA7 Then
    Declare PtrSafe Sub CopyMemory Lib "kernel32.dll" Alias _
            "RtlMoveMemory" (ByRef Destination As LongPtr, ByRef Source As LongPtr, _
            ByVal Length As LongPtr)
#Else
    Declare PtrSafe Sub CopyMemory Lib "kernel32.dll" Alias _
           "RtlMoveMemory" (Destination As Long, Source As Long, _
            ByVal Length As Long)
#End If

Sub Main2()
    Dim c As Long, d As Long

    c = 3
    Move2 VarPtr(c)
    Debug.Print c

End Sub

Sub Move2(ByVal pointerOfi As LongPtr)
    Dim tempvalue As Long

    CopyMemory VarPtr(tempvalue), pointerOfi, LenB(pointerOfi)
    tempvalue = tempvalue + 1
    CopyMemory pointerOfi, VarPtr(tempvalue), LenB(pointerOfi)

End Sub

1 Ответ

0 голосов
/ 19 февраля 2019

Ваше объявление аргументов CopyMemory не включает ключевое слово ByVal, поэтому все аргументы передаются по ссылке (ByRef), это означает, что здесь:

CopyMemory VarPtr(tempvalue), pointerOfi, LenB(pointerOfi)

CopyMemoryпередается ссылка (адрес) из двух длинных значений, которые являются результатом оценки VarPtr(tempvalue) & pointerOfi, а не фактическими значениями, содержащимися в этих переменных.

Еслиу вас есть переменная, которая содержит адрес памяти, тогда вам нужно передать само значение, а не адрес переменной, содержащей значение:

CopyMemory ByVal VarPtr(tempvalue), ByVal pointerOfi, LenB(pointerOfi)

Обратите внимание, что вы можете воспользоваться ByRef и не беспокоитьсяо сырых указателях вообще:

Sub Main2()
    Dim c As Long, d As Long

    c = 3
    Move2 c
    Debug.Print c
End Sub

Sub Move2(x As Long)
    Dim tempvalue As Long

    CopyMemory tempvalue, x, LenB(tempvalue)
    tempvalue = tempvalue + 1
    CopyMemory x, tempvalue, LenB(x)
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...