Пытаясь преобразовать ObjPtr в объект, я получаю ядро ​​не найдено ошибку 53 в 64 битах, но не в 32 битах - PullRequest
0 голосов
/ 31 марта 2020

Я имею в виду родительский класс из дочернего класса; вместо того, чтобы просто делать, для примера :

Public Property Set Parent(obj As ClassProperties)
    Set this.ParentColl = obj
End Property

я предпочитаю избегать ссылок на запутывание и запутывание и ошибку «недостаточно памяти», когда я oop прошёл и создал экземпляры класса, поэтому я использую это , основанное на , что .

Он функционирует как брелок в 32 битах, но в 64 битах я получаю Ошибка выполнения '53' Файл не найден: ядро.

В модуле:

#If VBA7 Then
    Private Declare PtrSafe Sub CopyMemory Lib "kernel" Alias "RtlMoveMemory" _
     (dest As Any, Source As Any, ByVal Length As LongPtr)
#Else
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
     (dest As Any, Source As Any, ByVal Length As Long)
#End If

'Returns an object given its pointer.
Public Function ObjFromPtr(ByVal pObj As Long) As Object
    Dim obj As Object
    CopyMemory obj, pObj, 4
    Set ObjFromPtr = obj
    CopyMemory obj, 0&, 4
End Function

Public Function ObjFromPtrVBA7(ByVal pObj As LongPtr) As Object
    Dim obj As Object
    CopyMemory obj, pObj, 4  <== here is the error
    Set ObjFromPtrVBA7 = obj
    CopyMemory obj, 0&, 4
End Function

В дочернем классе:

    #If VBA7 Then 'Uses modParentChildDereference
    Private mlParentPtr As LongPtr
    #Else
    Private mlParentPtr As Long
    #End If
Public Property Get Parent() As ClassProperties 
    #If VBA7 Then 'Uses modParentChildDereference
    Set Parent = modParentChildDereference.ObjFromPtrVBA7(mlParentPtr)
    #Else
    Set Parent = modParentChildDereference.ObjFromPtr(mlParentPtr)
    #End If
End Property
Public Property Set Parent(obj As ClassProperties)
    mlParentPtr = ObjPtr(obj)
End Property

В родительском классе :

    Set newItem.Parent = Me

В CopyMemory obj, pObj , 4 Я вижу LongPtr, например 1234567789 ^, но CopyMemory не может найти Obj в ядре.

Я прочитал некоторые глубокие темы по CopyMemory здесь и здесь .

Основываясь на тех, что я немного поиграл с CopyMemory obj, pObj, 4 и дал ему разные цифры, например, 8 и 16, но безрезультатно.

Какие-либо направления или решения? ТИА

1 Ответ

0 голосов
/ 01 апреля 2020

Ссылка, предоставленная @UnhandledException в приведенном выше комментарии, направила меня к удивительной теме

Я реализовал ее, адаптируясь к 64 битам - см. Мой ответ там - и получил совершенно другой вид ошибок, даже сбой VBE, видеодрайвер и windows.

Но один комментарий на OP открыл мне глаза:

Пожалуйста, не трудно -кодировать размер ... когда-либо. LenB для VBA такой же, как sizeof для C. Используйте его, чтобы определить размер выделения для API памяти копирования. - это

Вернуться к работе:

Public Function ObjFromPtr(ByVal pObj As Long) As Object
    Dim obj As Object
    CopyMemory obj, pObj, LenB(obj) 'not size 4!
    Set ObjFromPtr = obj
    CopyMemory obj, 0&, LenB(obj) 'not size 4!
End Function

Public Function ObjFromPtrVBA7(ByVal pObj As LongPtr) As Object
    Dim obj As Object
    CopyMemory obj, pObj, LenB(obj) 'not size 4!  <== here the error no more!!!!
    Set ObjFromPtrVBA7 = obj
    CopyMemory obj, 0&, LenB(obj) 'not size 4!
End Function

Итак, ответили.

Большое спасибо сообществу!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...