Ваше объявление аргументов 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