Zugriff auf mit 'FileInstall' eingebundene Skriptressourcen

Hilfreiche Erklärungen und Tipps zum Lernen von Autohotkey

Moderator: jNizM

just me
Posts: 4790
Joined: 02 Oct 2013, 08:51
Location: Germany

Zugriff auf mit 'FileInstall' eingebundene Skriptressourcen

13 Feb 2014, 03:35

Das Kommando FileInstall fügt beliebige Dateien in die beim Kompilieren erzeugte exe Datei ein. Normalerweise wird es dafür genutzt, diese Dateien bei der Ausführung der Anwendung in das Dateisystem zu stellen. Die Hilfe sagt dazu:
Bemerkungen

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).

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 aus
Sobald das kompilierte Script ausgeführt und FileInstall erreicht wird, wird die Datei ins Ziel extrahiert.
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,
  1. die nicht ins Dateisystem gestellt werden und
  2. 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] [Expand] [Download] GeSHi © Codebox Plus



So weit, so gut. Jetzt haben wir einen Pointer auf die Daten und die Größe in Bytes. Für viele Zwecke mag das ausreichen, um die Daten weiter zu verwenden. Wenn es aber um Bilder geht, ist das noch nicht wirklich hilfreich. Dem Himmel sei Dank hat SKAN für dieses Problem schon eine Lösung im alten Forum vorgestellt (siehe). Mit ein paar kleinen Änderungen kann man dieser ein Ressourcenobjekt aus FI_GetResource() übergeben, und schon spuckt sie ein HBITMAP oder HICON Handle aus:

Code: [Select all] [Expand] [Download] GeSHi © Codebox Plus



Zuletzt noch ein Demoskript, den Namen der Bilddatei müsst ihr anpassen, die FileInstall Anweisung steht aus gutem Grund ganz unten:

Code: [Select all] [Expand] [Download] GeSHi © Codebox Plus

Last edited by just me on 24 Jan 2017, 09:38, edited 2 times in total.
Remaining with AHK 1.1.25.02 until v2 will become beta.
User avatar
Holle
Posts: 180
Joined: 01 Oct 2013, 23:19

Re: Zugriff auf mit 'FileInstall' eingebundene Skriptressour

13 Feb 2014, 05:36

WOW, genau danach habe ich gesucht.
Vielen Dank!
User avatar
nnnik
Posts: 2275
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: Zugriff auf mit 'FileInstall' eingebundene Skriptressour

13 Feb 2014, 08:23

Nice :D
Recommends AHK Studio
ruespe
Posts: 25
Joined: 09 Nov 2013, 04:47

Re: Zugriff auf mit 'FileInstall' eingebundene Skriptressour

26 Feb 2014, 14:02

Bravo. Gut und verständlich beschrieben. Und dann auch noch ein lauffähiges Beispiel.
Peter2
Posts: 218
Joined: 21 Sep 2014, 14:38
Location: CH
Contact:

Re: Zugriff auf mit 'FileInstall' eingebundene Skriptressourcen

28 Sep 2015, 05:19

Vielen Dank - habe es jetzt (fast) hingekriegt mit #Include und zwei verschiedenen Bildtypen.

Aber: die Grössenanpassung habe ich nicht im Griff. Die Bilder sind gross - und bleiben gross, obwohl ich sie anpassen will. Wahrscheinlich habe ich irgendeinen Grundbefehl verbockt ...

Die relevanten Fragmente sind:

Code: [Select all] [Expand] [Download] GeSHi © Codebox Plus


Die Bilder (1 EMF, 1 PNG) erscheinen zwar im GUI, aber riesig in der Originalgrösse. Ich hatte es auch schon mit h-1 bzw. dem Wert 0x40 (statt Variable) versucht - das Bild bleibt riesig ....

Ich danke für einen Hinweis zu meinem Fehler.
Peter (AHK Beginner) / Win 7 x64, AHK Version v1.1.22.xx
User avatar
jNizM
Posts: 2290
Joined: 30 Sep 2013, 01:33
GitHub: jNizM
Contact:

Re: Zugriff auf mit 'FileInstall' eingebundene Skriptressourcen

28 Sep 2015, 05:31

Du musst die größe definieren (w & h)
Gui, Add, Picture, x** y** w*** h***, ...
[AHK] 1.1.26.01 x64 Unicode | [WIN] 10 Pro (Version 1703) x64
My GitHub Profile | Donations are appreciated if I could help you
Peter2
Posts: 218
Joined: 21 Sep 2014, 14:38
Location: CH
Contact:

Re: Zugriff auf mit 'FileInstall' eingebundene Skriptressourcen

28 Sep 2015, 05:47

Das heisst, diverse Varianten wie h-1 klappen hier nicht?

BTW: Ich habe auch in der Hilfe und im Forum gesucht, was +0xE im Code heisst - war nicht erfolgreich ...

Code: [Select all] [Download] GeSHi © Codebox Plus

Gui, Add, Picture, w200 h200 hwndHPIC Border AltSubmit +0xE +%SS_REALSIZECONTROL%
Peter (AHK Beginner) / Win 7 x64, AHK Version v1.1.22.xx
User avatar
jNizM
Posts: 2290
Joined: 30 Sep 2013, 01:33
GitHub: jNizM
Contact:

Re: Zugriff auf mit 'FileInstall' eingebundene Skriptressourcen

28 Sep 2015, 06:14

Also soweit ich weiß nimmt man entweder
Gui, Add, Picture, w200 h200 +0xE hwndHPIC (+0x40 Passt die Bitmap auf die Größe des Steuerelements an)
oder
Gui, Add, Picture, w200 h-1 +0xE hwndHPIC
[AHK] 1.1.26.01 x64 Unicode | [WIN] 10 Pro (Version 1703) x64
My GitHub Profile | Donations are appreciated if I could help you
just me
Posts: 4790
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Zugriff auf mit 'FileInstall' eingebundene Skriptressourcen

29 Sep 2015, 01:40

Moin,

so, wie das hier vorgestellt wurde, muss man die Größe des Controls (w... und h...) festlegen. Das sollte ja aber bei Bildern, die man selbst per FileInstall eingebunden hat, kein Problem sein. Angaben wie w-1 oder h-1 bringen hier nichts, weil die Bilder nicht per Gui... Anweisung von AHK geladen werden, und AHK deshalb die Größe der Bilder nicht kennt.

Außerdem muss man den Stil SS_BITMAP (0x0E) (bzw. SS_ICON (0x03)) setzen, der die Art des Bildes festlegt, das das Control später anzeigen soll. Wenn die Göße des Bildes nicht mit der des Controls übereinstimmt muss dem Control auch der Stil SS_REALSIZECONTROL (0x40) zugewiesen werden, allerdings mit der Option +, weil sonst der im Beispiel davor einzeln zugewiesene Stil SS_BITMAP (0x0E) sofort wieder entfernt wird. Zusammengefasst kann man auch die Kombination 0x4E (auch ohne +) zuweisen.

Alternativ (und von mir bevorzugt, weil man die volle Kontrolle über das Ergebnis hat) kann man die Bildgröße mit einem Bildeditor auf die gewünschte Größe anpassen und dann die angepassten Bilder einbinden. Dann braucht es SS_REALSIZECONTROL nicht.
Remaining with AHK 1.1.25.02 until v2 will become beta.
highend
Posts: 43
Joined: 24 Nov 2014, 16:57

Re: Zugriff auf mit 'FileInstall' eingebundene Skriptressourcen

05 Oct 2015, 02:09

Wäre es auch möglich, das Ganze mit einer .dll (die dann die zugehörigen icons enthält) Datei zu benutzen, statt mit einer Liste von Grafikdateien?
just me
Posts: 4790
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Zugriff auf mit 'FileInstall' eingebundene Skriptressourcen

05 Oct 2015, 02:24

Um Icons aus einer DLL zu laden, brauchst Du das hier gar nicht (siehe).
Remaining with AHK 1.1.25.02 until v2 will become beta.
highend
Posts: 43
Joined: 24 Nov 2014, 16:57

Re: Zugriff auf mit 'FileInstall' eingebundene Skriptressourcen

05 Oct 2015, 05:57

Sicher geht das auch anders, aber nur wenn man wiederum per FileInstall die .dll auch wirklich auf dem Rechner ablegen will. Da meine momentane Applikation allerdings zwar in einem administrativ geschütztem Ordner abgelegt werden darf, selber aber nicht mit höheren Rechten laufen soll wäre eure hier vorgestellte Lösung optimal...
Peter2
Posts: 218
Joined: 21 Sep 2014, 14:38
Location: CH
Contact:

Re: Zugriff auf mit 'FileInstall' eingebundene Skriptressourcen

05 Oct 2015, 06:05

Und was spricht dagegen, die Bilder aus der DLL zu nehmen und in die EXE zu packen und dann wie beschrieben zu verwenden?
Oder du verwendest ausser dem Programmverzeichnis noch ein Verzeichnis unter "Appdata", wo das Programm sein Zeugs hinlegen kann.
Peter (AHK Beginner) / Win 7 x64, AHK Version v1.1.22.xx
highend
Posts: 43
Joined: 24 Nov 2014, 16:57

Re: Zugriff auf mit 'FileInstall' eingebundene Skriptressourcen

05 Oct 2015, 06:36

Und was spricht dagegen, die Bilder aus der DLL zu nehmen und in die EXE zu packen und dann wie beschrieben zu verwenden?

Etwa 300 FileInstall Aufrufe (~300 icons)...

Oder du verwendest ausser dem Programmverzeichnis noch ein Verzeichnis unter "Appdata", wo das Programm sein Zeugs hinlegen kann.

Sicher, das wäre das möglich. Aber bei mehreren hundert FileInstalls auch nicht gerade "super elegant" und es schränkt dann eben auch die Portabilität ein
(da das Data Verzeichnis dann getrennt im %TEMP% oder im %USERPROFILE% liegen müsste) :)

Wenn's nicht geht, dann geht's nicht. Fragen hielt ich hier aber für die sinnvollere Alternative.
Peter2
Posts: 218
Joined: 21 Sep 2014, 14:38
Location: CH
Contact:

Re: Zugriff auf mit 'FileInstall' eingebundene Skriptressourcen

05 Oct 2015, 07:04

highend wrote:... Fragen hielt ich hier aber für die sinnvollere Alternative.

Natürlich. Ich bin hier im Forum auch vor allem ein Fragender ...

Wenn es nur um ein Programm geht würde sich die einmalige Arbeit vielleicht auszahlen - alle Bilder aus der DLL holen und dann per Fileinstall dazupacken. Oder sich das "extract" und "add" von resourehacker anschauen - dass kann man mit Batch dann automatisch beim Kompilieren auslösen.

Code: [Select all] [Download] GeSHi © Codebox Plus

@echo off
rem ResHacker.exe command command_parameters
rem -add ExeFile, SaveAsFile, ResourceFile, ResourceMask
rem -addskip ExeFile, SaveAsFile, ResourceFile, ResourceMask
rem -addoverwrite ExeFile, SaveAsFile, ResourceFile, ResourceMask
rem -modify ExeFile, SaveAsFile, ResourceFile, ResourceMask
rem -extract ExeFile, ResourceFile, ResourceMask
rem -delete ExeFile, SaveAsFile, ResourceMask
rem ResHacker.exe -addoverwrite MyProg.exe, MyProgNew.exe, NewImage.bmp , bitmap,128,
Peter (AHK Beginner) / Win 7 x64, AHK Version v1.1.22.xx
highend
Posts: 43
Joined: 24 Nov 2014, 16:57

Re: Zugriff auf mit 'FileInstall' eingebundene Skriptressourcen

05 Oct 2015, 07:24

Wenn es nur um ein Programm geht würde sich die einmalige Arbeit vielleicht auszahlen - alle Bilder aus der DLL holen und dann per Fileinstall dazupacken

Das wäre gar nicht nötig, ich hab alle .ico Dateien auch einzeln da, ich verpacke sie lediglich in eine .dll (automatisiert). 300 FileInstalls kommen trotzdem nicht in Frage, dann löse ich das Problem lieber anders.

Oder sich das "extract" und "add" von resourehacker anschauen - dass kann man mit Batch dann automatisch beim Kompilieren auslösen.


Funktioniert mit der aktuellen Fassung hier nicht. Das log sagt, er hätte die aufsteigend nummerierten ICONGROUP's hinzugefügt, öffnet man die .dll danach wieder mit dem Resource Hacker, sieht man... weder Icon noch Icongroup Einträge, wobei die Ziel-DLL lustigerweise um die hinzugefügten Icons größer geworden ist. Spielt aber keine Rolle, es gibt ja u.a. Resource Tuner Console...

.
just me
Posts: 4790
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Zugriff auf mit 'FileInstall' eingebundene Skriptressourcen

05 Oct 2015, 15:42

Ich verstehe Dich nicht so ganz. Du kannst doch die DLL per FileInstall in A_AppData oder einem eigenen Unterverzeichnis ablegen, wenn sie noch nicht da ist. Das ist dann nur 1 FileInstall. Außerdem könntest Du für die Installation beider Teile auch ein SetUp-Programm basteln, das natürlich mit erhöhten Rechten ausgestattet sein müsste.
Remaining with AHK 1.1.25.02 until v2 will become beta.
haichen
Posts: 137
Joined: 09 Feb 2014, 08:24

Re: Zugriff auf mit 'FileInstall' eingebundene Skriptressourcen

13 Dec 2015, 08:35

Manche tollen Beiträge findet man immer etwas später. :D
Ganz langsam beginne ich das mit den pointern und dllCall zu begreifen...

Da ich gerade den Text aus Textresourcen wie htm js und css files brauchte, habe ich mir das ganze mühsam zusammengepusselt. Und dann finde ich das hier!!

Da habe ich hier auch gleich die Funktionen zur Textextraktion und zum Soundabspielen angepasst:

Code: [Select all] [Expand] [Download] GeSHi © Codebox Plus

Peter2
Posts: 218
Joined: 21 Sep 2014, 14:38
Location: CH
Contact:

Re: Zugriff auf mit 'FileInstall' eingebundene Skriptressourcen

07 Mar 2016, 09:40

Bis jetzt habe ich die einzubindenden Dateien im Scriptverzeichnis gehabt und daher ohne Pfad eingebunden:

Code: [Select all] [Download] GeSHi © Codebox Plus

If !(A_IsCompiled)
{
FileInstall, programmlogo.png, programmlogo.png, 0
}

Alles bestens, aber wenn dem Esel zu Wohl ist dann versucht er absolute Pfade:

Code: [Select all] [Download] GeSHi © Codebox Plus

If !(A_IsCompiled)
{
FileInstall, x:\Daten\Projekte\Switch\programmlogo.png, programmlogo.png, 0
}

Und jetzt ist der Spass vorbei - der ganze Pfad wird als Struktur in die Exe hineinkompiliert, und das AHK zum Auslesen findet das nicht mehr.
Hat schon jemand absolute Pfade erfolgreich verwendet?
Peter (AHK Beginner) / Win 7 x64, AHK Version v1.1.22.xx
haichen
Posts: 137
Joined: 09 Feb 2014, 08:24

Re: Zugriff auf mit 'FileInstall' eingebundene Skriptressourcen

07 Mar 2016, 11:45

Wenn Du programmlogo.png als ressource verwenden willst, ist der Klammerausdruck überflüssig. Fileinstall muss nur da stehen wo du sonst auch deine Funktionen hinschreibst. Es soll gar nicht "korrekt" ausgeführt werden. Der Kompiler bindet dann die Datei in exe ein, extrahiert sie aber nicht wenn die exe ausgeführt wird. Die eingebundene Datei findet sich dann immer an derselben Stelle in der kompilierten Exe. Das kannst Du mit dem ResHacker überprüfen.

Willst Du Fileinstall wie vorgesehen nutzen ist der If-Block ebenso unsinnig. Der Befehl sollte dann dort stehen wo FileInstall automatisch augeführt wird (vor dem ersten return im skript). Fileinstall verpackt beim kompilieren das Bild in die Exe. Beim Ausführen der exe wird das Bild dann in das Verzeichnis extrahiert, das du angegeben hast. In diesem Fall das Arbeitsverzeichnis.

Return to “Tutorials”

Who is online

Users browsing this forum: No registered users and 1 guest