![]() |
#24
|
|||||
|
|||||
![]() Quote:
![]() But anyway, the Byte Comb link you provided helps a little on that. Quote:
Well, its only a theory ![]() Code:
Set ObjectFromPointer = oTemp I also learned since that the first two options below will crash excel... Code:
Sub crashMem_Copy() Dim lptr As LongPtr ' Mem_Copy lptr, ByVal 0, 4 'crashes excel ' Mem_Copy lptr, ByVal lptr, 4 'crashes excel Mem_Copy lptr, lptr, 4 'is fine End Sub Quote:
![]() Quote:
Code:
Sub getReference() #If Win64 Then Const PTR_LENGTH As Long = 8 #Else Const PTR_LENGTH As Long = 4 #End If Const coBytes As Long = 4 Dim objwks As Worksheet, lptr As LongPtr, objName As String, objwksPtr As LongPtr Debug.Print ' Sheet1 Object reference and first coBytes bytes lptr = objPtr(Sheets(1)): objName = "Sheet1 " Debug.Print PointerToSomething(objName, lptr, coBytes) & vbTab & "using objPtr" ' Using objPtr, can't diferentiate because the reference is resolved before reporting Set objwks = Sheets(1) lptr = objPtr(objwks): objName = "objwks " Debug.Print PointerToSomething(objName, lptr, coBytes) & vbTab & "using objPtr" ' Using varPtr, can diferentiate. ' The local Worksheet Object is treated as a reference, not an Object: the reference is not resolved lptr = VarPtr(objwks): objName = "objwks " Debug.Print PointerToSomething(objName, lptr, coBytes) & vbTab & "using varPtr" ' The contents of the local variable (objwks) is the address of the global object but byte-reversed (little endian) ' Load the reference into a LongPtr type and read back the byte-corrected (big endian) value of the reference Mem_Copy objwksPtr, ByVal VarPtr(objwks), PTR_LENGTH Debug.Print objName & vbTab & "points to: " & "0x" & HexPtr(objwksPtr) ' Can also do this passing objwks as ByRef (default) Mem_Copy objwksPtr, objwks, PTR_LENGTH Debug.Print objName & vbTab & "points to: " & "0x" & HexPtr(objwksPtr) ' Or like this... Mem_Copy ByVal VarPtr(objwksPtr), objwks, PTR_LENGTH Debug.Print objName & vbTab & "points to: " & "0x" & HexPtr(objwksPtr) End Sub Code:
Sheet1 : Address: 0x18240578 : Contents: 0xC0EA4C18 using objPtr objwks : Address: 0x18240578 : Contents: 0xC0EA4C18 using objPtr objwks : Address: 0x002AEF90 : Contents: 0x78052418 using varPtr objwks points to: 0x18240578 objwks points to: 0x18240578 objwks points to: 0x18240578 And here you can see how the local variable's value is zero when its set to nothing... Code:
Sub getReference2() #If Win64 Then Const PTR_LENGTH As Long = 8 #Else Const PTR_LENGTH As Long = 4 #End If Const coBytes As Long = 4 Dim objwks As Worksheet, lptr As LongPtr, objName As String, objwksPtr As LongPtr Debug.Print ' Sheet1 Object reference and first coBytes bytes lptr = objPtr(Sheets(1)): objName = "Sheet1 " Debug.Print PointerToSomething(objName, lptr, coBytes) & vbTab & "using objPtr" ' Using varPtr, can see the local variable is set to nothing. ' The local Worksheet Object is treated as a reference, not an Object: the reference is not resolved lptr = VarPtr(objwks): objName = "objwks " Debug.Print PointerToSomething(objName, lptr, coBytes) & vbTab & "using varPtr, set to Nothing" ' Using objPtr, can't diferentiate because the reference is resolved before reporting Set objwks = Sheets(1) lptr = objPtr(objwks): objName = "objwks " Debug.Print PointerToSomething(objName, lptr, coBytes) & vbTab & "using objPtr" ' Using varPtr, can diferentiate. ' The local Worksheet Object is treated as a reference, not an Object: the reference is not resolved lptr = VarPtr(objwks): objName = "objwks " Debug.Print PointerToSomething(objName, lptr, coBytes) & vbTab & "using varPtr" ' The contents of the local variable (objwks) is the address of the global object but byte-reversed (little endian) ' Load the reference into a LongPtr type and read back the byte-corrected (big endian) value of the reference Mem_Copy objwksPtr, ByVal VarPtr(objwks), PTR_LENGTH Debug.Print objName & vbTab & "points to: " & "0x" & HexPtr(objwksPtr) End Sub Code:
Sheet1 : Address: 0x18240578 : Contents: 0xC0EA4C18 using objPtr objwks : Address: 0x002AEF90 : Contents: 0x00000000 using varPtr, set to Nothing objwks : Address: 0x18240578 : Contents: 0xC0EA4C18 using objPtr objwks : Address: 0x002AEF90 : Contents: 0x78052418 using varPtr objwks points to: 0x18240578 Quote:
In summary, I cant see any reason to set local objects to nothing at the end of a sub. Even if there is an error and the sub doesn't complete normally, or if there are structures that fool the reference counting, everything is still cleaned up in the former and the set to nothing does nothing extra in the latter. I learned a lot from this exercise and added some nice routines to my library, so this has been most interesting! For anyone who wants to run the above routines, here is a .bas file with everything you need... well its .txt but just need to change it to .bas and you can import into a module. Last edited by CoolBlue; 06-22-2014 at 08:38 AM. Reason: added .bas attachment; added outputs from debug window |
|
![]() |
||||
Thread | Thread Starter | Forum | Replies | Last Post |
Wierd "script code" in a downloaded .doc file | CNBarnes | Word | 2 | 10-18-2012 02:07 AM |
![]() |
krishnaoptif | Word VBA | 9 | 06-22-2012 05:08 AM |
![]() |
Jamal NUMAN | Word | 2 | 07-03-2011 03:11 AM |
Rules and Alerts: "run a script"? | discountvc | Outlook | 0 | 06-15-2010 07:36 AM |
An "error has occurred in the script on this page" | decann | Outlook | 8 | 09-03-2009 08:54 AM |