31. ObjPtr() w dugą stronę.... czyli jak ze wskaźnika odtworzyć zmienną obiektową?

Jak wiadomo funkcja ObjPtr(zmienna_obiektowa) zwraca wskaźnik do obiektu podanego w parametrze. Wskaźnik jest liczbą typu Long i świetnie się nadaje na parametr dla różnych wywołań, w przeciwieństwie do zmiennej typu Object. No dobrze... Przekazaliśmy wskaźnik, ale jak teraz odtworzyć na jego podstawie nasz objekt? Służy do tego poniższa funkcja, którą można skopiować do jakiegoś modułu globalnego.
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
    (dest As Any, source As Any, ByVal bytes As Long)

Public Function PtrToObject(ByVal iObj As Long) As Object
  Dim nObj As Object
  If VarType(iObj) = vbLong Then
    CopyMemory nObj, CLng(iObj), 4
  Else
    Exit Function
  End If
  Set PtrToObject = nObj
  CopyMemory nObj, 0&, 4
End Function
Jak widać, użyliśmy "nieśmiertelnego" CopyMemory (podoba mi się coraz bardziej ta funkcja). A teraz w jaki sposób należy korzystać z tej funkcji... Oto prosty przykład:
'Przypuśćmy, że z poziomu formularza Form1 wywołaliśmy formularz Form2 w taki sposób:
'DoCmd.OpenForm "Form2", , , , , , ObjPtr(Me.Form)
'Aby w formularzu Form2 odtworzyć obiekt Form1, wystarczy napisać:
Dim F As Form
    Set F = PtrToObject(CLng(Me.OpenArgs))
    MsgBox F.Name
'Komunikat zwróci nam nazwę obiektu, który przekazaliśmy w parametrze funkcji ObjPtr()

Patrz przykład Krzysztofa Naworyty tutaj.