Wie lexikos im anderen Forum erklärt hat (siehe) gilt das für den von fincs geschriebenen aktuellen Compiler nicht mehr so ganz. Die Dateien werden weder komprimiert noch verschlüsselt, sondern unverändert als Ressourcen vom Typ RCDATA eingebunden. Außerdem ergibt sich ausBemerkungen
Dieser Befehl ist eine Direktive für den Ahk2Exe-Compiler, die Dir erlaubt, zusätzliche Dateien in das kompilierte Script einzufügen. Sobald das kompilierte Script ausgeführt wird, werden diese Dateien wieder auf das Laufwerk extrahiert.
Die Datei wird hinzugefügt, während das Script kompiliert wird. Sobald das kompilierte Script ausgeführt und FileInstall erreicht wird, wird die Datei ins Ziel extrahiert.
Dateien, die auf diese Weise hinzugefügt werden, sind komprimiert und auch verschlüsselt.
Wenn dieser Befehl in einem normalen (nicht kompilierten) Script verwendet wird, erfolgt stattdessen ein einfaches Kopieren der Datei (das hilft dabei, Skripts zu testen, die eventuell kompiliert werden sollen).
dass sie Dateien eben nicht extrahiert werden, wenn die Anweisung FileInstall an einer Stelle im Skript steht, die nicht ausgeführt wird. Beides zusammen schafft die Möglichkeit, Dateien in die kompilierte exe einzubinden,Sobald das kompilierte Script ausgeführt und FileInstall erreicht wird, wird die Datei ins Ziel extrahiert.
- die nicht ins Dateisystem gestellt werden und
- auf die dennoch mit Hilfe der API Funktionen für Ressourcen zugegriffen werden kann.
Der Zugriff gestaltet sich relativ einfach, wenn man sich das o.a. Beispiel von lexikos anschaut. Man braucht dafür nur den im Kommando FileInstall als Parameter Quelle verwendeten Namen, der Ressourcentyp ist immer RCDATA. Ich habe das mal in die folgende Funktion gepackt (die internen Beschreibungen sind leider englisch, das sollte aber keine allzu hohe Hürde sein):
Code: Select all
; ======================================================================================================================
; FI_GetResource Loads a resource included in a compiled script with 'FileInstall'.
; Parameters:
; ResName - The name of the resource, i.e. file name as used as source parameter in 'FileInstall'.
; Return values:
; If the resource is available, the function returns an object containing two key/value pairs:
; Ptr - Pointer to the resource data.
; Size - Size of data in bytes.
; Otherwise, the return value is zero.
; Credits:
; Adopted from a scriptlet written by lexikos
; -> www.autohotkey.com/board/topic/76065-fileextract-fileextract-tomem-examples-for-unicode-builds/
; ======================================================================================================================
FI_GetResource(ResName) {
; RT_RCDATA := 10
If !(A_IsCompiled)
Return False
If (HRSRC := DllCall("Kernel32.dll\FindResource", "Ptr", 0, "Str", ResName, "Ptr", 10, "UPtr"))
&& (HRES := DllCall("Kernel32.dll\LoadResource", "Ptr", 0, "Ptr", HRSRC, "UPtr"))
Return {Ptr: DllCall("Kernel32.dll\LockResource", "Ptr", HRES, "UPtr")
, Size: DllCall("Kernel32.dll\SizeofResource", "Ptr", 0, "Ptr", HRSRC, "UInt")}
Return False
}
Code: Select all
; ======================================================================================================================
; FI_GetImage Gets a handle to an image included in a compiled script with 'FileInstall'.
; Parameters:
; ImgRes - Resource object as returned by FI_GetResource().
; ImgType - Type of the included image: 0 = Image, 1 = Icon.
; Return values:
; Returns the handle to the image data on success; otherwise zero.
; Credits:
; Bitmap creation adopted from "How to convert Image data (JPEG/PNG/GIF) to Image ?" by SKAN
; -> www.autohotkey.com/board/topic/21213-how-to-convert-image-data-jpegpnggif-to-Image/?p=139257
; ======================================================================================================================
FI_GetImage(ImgRes, ImgType := 0) {
If !(A_IsCompiled)
Return False
If !IsObject(ImgRes) || (ImgRes.Ptr = "") || (ImgRes.Size = "")
Return False
GlData := DllCall("Kernel32.dll\GlobalAlloc", "UInt", 2, "UPtr", ImgRes.Size, "UPtr")
Data := DllCall("Kernel32.dll\GlobalLock", "Ptr", GlData, "UPtr")
DllCall("Kernel32.dll\RtlMoveMemory", "Ptr", Data, "Ptr", ImgRes.Ptr, "UPtr", ImgRes.Size)
DllCall("Kernel32.dll\GlobalUnlock", "Ptr", GlData )
DllCall( "Ole32.dll\CreateStreamOnHGlobal", "Ptr", GlData, "Int", True, "PtrP", Stream)
GdipHMod := DllCall("Kernel32.dll\LoadLibrary", "Str", "Gdiplus.dll", "UPtr")
VarSetCapacity(SI, 16, 0), NumPut(1, SI, 0, "UChar")
DllCall("Gdiplus.dll\GdiplusStartup", "PtrP", GdipToken, "Ptr", &SI, "Ptr", 0)
DllCall("Gdiplus.dll\GdipCreateBitmapFromStream", "Ptr", Stream, "PtrP", Bitmap)
If (ImgType = 0)
DllCall("Gdiplus.dll\GdipCreateHBITMAPFromBitmap", "Ptr", Bitmap, "PtrP", Image, "UInt", 0)
Else
DllCall("Gdiplus.dll\GdipCreateHICONFromBitmap", "Ptr", Bitmap, "PtrP", Image)
DllCall("Gdiplus.dll\GdipDisposeImage", "Ptr", Bitmap )
DllCall("Gdiplus.dll\GdiplusShutdown", "Ptr", GdipToken )
DllCall("Kernel32.dll\FreeLibrary", "Ptr", GdipHMod)
DllCall(NumGet(NumGet(Stream + 0, 0, "UPtr") + (A_PtrSize * 2), 0, "UPtr"), "Ptr", Stream) ; Stream::Release
DllCall("Kernel32.dll\GlobalFree", "Ptr", GlData, "UPtr")
Return Image
}
Code: Select all
#NoEnv
SS_REALSIZECONTROL := 0x40
IncludedImage := "Pic.png"
If (A_IsCompiled) {
Gui, Margin, 20, 20
Gui, Add, Picture, w200 h200 hwndHPIC Border AltSubmit +0xE +%SS_REALSIZECONTROL%
Image := FI_GetResource("Pic.png")
HIMG := FI_GetImage(Image)
SetImage(HPIC, HIMG)
Gui, Show, , Res Test
Return
}
Else
MsgBox, 0, Res Sample, Compile the script, please.
GuiClose:
ExitApp
; ======================================================================================================================
SetImage(HWND, HIMG) {
SendMessage, 0x172, 0, HIMG, , ahk_id %HWND%
Return (ErrorLevel = "FAIL" ? 0 : ErrorLevel)
}
; ======================================================================================================================
; FI_GetResource Loads a resource included in a compiled script with 'FileInstall'.
; Parameters:
; ResName - The name of the resource, i.e. file name as used as source parameter in 'FileInstall'.
; Return values:
; If the resource is available, the function returns an object containing two key/value pairs:
; Ptr - Pointer to the resource data.
; Size - Size of data in bytes.
; Otherwise, the return value is zero.
; Credits:
; Adopted from a scriptlet written by lexikos
; -> www.autohotkey.com/board/topic/76065-fileextract-fileextract-tomem-examples-for-unicode-builds/
; ======================================================================================================================
FI_GetResource(ResName) {
; RT_RCDATA := 10
If !(A_IsCompiled)
Return False
If (HRSRC := DllCall("Kernel32.dll\FindResource", "Ptr", 0, "Str", ResName, "Ptr", 10, "UPtr"))
&& (HRES := DllCall("Kernel32.dll\LoadResource", "Ptr", 0, "Ptr", HRSRC, "UPtr"))
Return {Ptr: DllCall("Kernel32.dll\LockResource", "Ptr", HRES, "UPtr")
, Size: DllCall("Kernel32.dll\SizeofResource", "Ptr", 0, "Ptr", HRSRC, "UInt")}
Return False
}
; ======================================================================================================================
; FI_GetImage Gets a handle to an image included in a compiled script with 'FileInstall'.
; Parameters:
; ImgRes - Resource object as returned by FI_GetResource().
; ImgType - Type of the included image: 0 = Image, 1 = Icon.
; Return values:
; Returns the handle to the image data on success; otherwise zero.
; Credits:
; Bitmap creation adopted from "How to convert Image data (JPEG/PNG/GIF) to Image ?" by SKAN
; -> www.autohotkey.com/board/topic/21213-how-to-convert-image-data-jpegpnggif-to-Image/?p=139257
; ======================================================================================================================
FI_GetImage(ImgRes, ImgType := 0) {
If !(A_IsCompiled)
Return False
If !IsObject(ImgRes) || (ImgRes.Ptr = "") || (ImgRes.Size = "")
Return False
GlData := DllCall("Kernel32.dll\GlobalAlloc", "UInt", 2, "UPtr", ImgRes.Size, "UPtr")
Data := DllCall("Kernel32.dll\GlobalLock", "Ptr", GlData, "UPtr")
DllCall("Kernel32.dll\RtlMoveMemory", "Ptr", Data, "Ptr", ImgRes.Ptr, "UPtr", ImgRes.Size)
DllCall("Kernel32.dll\GlobalUnlock", "Ptr", GlData )
DllCall( "Ole32.dll\CreateStreamOnHGlobal", "Ptr", GlData, "Int", True, "PtrP", Stream)
GdipHMod := DllCall("Kernel32.dll\LoadLibrary", "Str", "Gdiplus.dll", "UPtr")
VarSetCapacity(SI, 16, 0), NumPut(1, SI, 0, "UChar")
DllCall("Gdiplus.dll\GdiplusStartup", "PtrP", GdipToken, "Ptr", &SI, "Ptr", 0)
DllCall("Gdiplus.dll\GdipCreateBitmapFromStream", "Ptr", Stream, "PtrP", Bitmap)
If (ImgType = 0)
DllCall("Gdiplus.dll\GdipCreateHBITMAPFromBitmap", "Ptr", Bitmap, "PtrP", Image, "UInt", 0)
Else
DllCall("Gdiplus.dll\GdipCreateHICONFromBitmap", "Ptr", Bitmap, "PtrP", Image)
DllCall("Gdiplus.dll\GdipDisposeImage", "Ptr", Bitmap )
DllCall("Gdiplus.dll\GdiplusShutdown", "Ptr", GdipToken )
DllCall("Kernel32.dll\FreeLibrary", "Ptr", GdipHMod)
DllCall(NumGet(NumGet(Stream + 0, 0, "UPtr") + (A_PtrSize * 2), 0, "UPtr"), "Ptr", Stream) ; Stream::Release
DllCall("Kernel32.dll\GlobalFree", "Ptr", GlData, "UPtr")
Return Image
}
; ======================================================================================================================
; The following line will not be executed, but processed by the compiler
FileInstall, Pic.png, Pic.png ; adjust both names to the value of 'IncludedImage'
; ======================================================================================================================