+Fixed to load file compressed with UnZipRawMemory
https://www.autohotkey.com/boards/viewtopic.php?f=6&t=3573
Code: Select all
;ahk_h v2
ObjLoad(addr,objects:=0)
{
if Type(addr)="string" ; FileRead Mode
{
if !FileExist(addr)
return
else
v:=FileRead(addr,"RAW")
if ErrorLevel||!sz:=FileGetSize(addr)
return
if UnZipRawMemory(&v, sz, unzip)
addr:=&unzip
else
addr:=&v
}
obj:=[],end:=addr+8+(sz:=NumGet(addr,"Int64")),addr+=8,(!objects)?objects:={0:obj}:objects.Push(obj)
While addr<end ; 9 = Int64 for size and Char for type
{
if NumGet(addr,"Char")=-12
k:=objects[NumGet(addr+1,"Int64")],addr+=9
else if NumGet(addr,"Char")=-11
k:=ObjLoad(addr+1,objects),addr+=9+NumGet(addr+1,"Int64")
else if NumGet(addr,"Char")=-10
sz:=NumGet(addr+1,"Int64"),k:=StrGet(addr+9),addr+=sz+9
else
k:=NumGet(addr+1,SubStr("Char UChar Short UShortInt UInt Int64 UInt64Double",(sz:=-NumGet(addr,"Char"))*6-5,6)),addr+=SubStr("112244888",sz,1)+1
if NumGet(addr,"Char")=12
obj[k]:=objects[NumGet(addr+1,"Int64")],addr+=9
else if NumGet(addr,"Char")=11
obj[k]:=ObjLoad(addr+1,objects),addr+=9+NumGet(addr+1,"Int64")
else if NumGet(addr,"Char")=10
obj[k]:=StrGet(addr+9),obj.SetCapacity(k,sz:=NumGet(addr+1,"Int64")),DllCall("RtlMoveMemory","PTR",obj.GetAddress(k),"PTR",addr+9,"PTR",sz),addr+=sz+9
else
obj[k]:=NumGet(addr+1,SubStr("Char UChar Short UShortInt UInt Int64 UInt64Double",(sz:=NumGet(addr,"Char"))*6-5,6)),addr+=SubStr("112244888",sz,1)+1
}
return obj
}