Quote Originally Posted by chemicalNova
Or you could use something like this:
VB Code:
  1. Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (A As _
  2. Any, b As Any, ByVal C As Long)
  3.  
  4.  
  5. Private Declare Function lstrlenW Lib "kernel32" (ByVal lpString As Any) As _
  6. Long
  7.  
  8. Public Type CollectionData
  9.    Unk0(0 To 2) As Long
  10.    Unk1 As Long
  11.    ElementCount As Long
  12.    Unk2 As Long
  13.    PtrFirstElement As Long
  14.    PtrLastElement As Long
  15.    Unk3 As Long
  16.    Unk4 As Long
  17.    Unk5 As Long
  18. End Type
  19.  
  20.  
  21. Public Type CollectionElement
  22.    Data As Variant
  23.    Key As Long
  24.    PtrPrev As Long
  25.    PtrNext As Long
  26.    Unk0 As Long
  27.    Unk1 As Long
  28.    Unk2 As Long
  29. End Type
  30.  
  31. Function CollectionGetKeys(ByVal Col As Collection) As String()
  32. Dim asKeys() As String
  33. Dim lIdx As Long
  34. Dim tColl As CollectionData
  35. Dim tColElem As CollectionElement
  36. If Col.Count > 0 Then
  37.     ReDim asKeys(1 To Col.Count)
  38.     MoveMemory tColl, ByVal ObjPtr(Col), LenB(tColl)
  39.     tColElem.PtrNext = tColl.PtrFirstElement
  40.     For lIdx = 1 To tColl.ElementCount
  41.         MoveMemory tColElem, ByVal tColElem.PtrNext, LenB(tColElem)
  42.         asKeys(lIdx) = pvPtr2Str(tColElem.Key)
  43.     Next
  44. End If
  45. CollectionGetKeys = asKeys
  46. End Function
  47.  
  48. Function pvPtr2Str(lpszA As Long) As String
  49. pvPtr2Str = String$(lstrlenW(lpszA), 0)
  50. MoveMemory ByVal StrPtr(pvPtr2Str), ByVal lpszA, lstrlenW(lpszA) * 2
  51. End Function
..it can cause problems though. I'm not sure I've done it correctly. But it will return the keys you want.

chem
Chem.. y would one want to use this way as there are a lot of easier options (like creating custom class or using Dictionary object)