Kann man Bilder, also z.B. Icons, in die .exe einbinden, so dass man die Icon-Dateien nicht immer extra mitliefern muss?
Icon Datei in .exe einbinden
-
HansJ54 -
2. Juli 2020 um 01:02 -
Erledigt
-
-
Der Befehl FileInstall könnte was für dich sein.
-
Ich verstehe die Hilfe zu diesem Befehl nicht, sieht für mich so aus, als ob ich eine Datei von irgendwo nach irgendwo anders kopiere. Falls tatsächlich inkludiert, sehe ich auch nicht, wie ich die Icons im Programm nutzen kann.
Ziel ist, zwei Icons (red.ico und green.ico) in die compilierte Version einzubinden, so dass ich nachher nur die eine .exe habe und nicht noch 2 einzelne .ico-Dateien zusätzlich.
Andere Möglichkeit: kann ich irgendwie in der GUI kreisförmige Objekte ähnlich wie unten erzeugen, dann brauche ich die Icons nicht:
Könnten auch viereckige Klötzchen sein ...
-
Ich verstehe die Hilfe zu diesem Befehl nicht, sieht für mich so aus, als ob ich eine Datei von irgendwo nach irgendwo anders kopiere. Falls tatsächlich inkludiert, sehe ich auch nicht, wie ich die Icons im Programm nutzen kann.
Dann lies dir doch mal die Beschreibung in der Hilfe durch die ich verlinkt habe und probier das dazu verlinkte Skript auch gleich mal aus, vielleicht wird es dann klar?
Die FileInstall-Funktion sorgt beim Kompilieren dafür, dass die Datei die du angibst in deine Exe eingeschrieben wird. Beim Start der Exe, wird die Datei dann in den vorgegebenen Pfad extrahiert, und steht dir zur Verfügung.
Also FileInstall nutzen und dann später einfach auf den extrahierten Pfad zeigen lassen in deiner GUICtrlCreateIcon (oder welche Funktion du dafür verwendest).
Du könntest natürlich auch die Icons selber erzeugen (scheint ja nicht sonderlich kompliziert auszusehen) indem du Gdi+ anschmeißt aber ohne herablassend klingen zu wollen, scheint das über deinem Wissensstand zu liegen und ist schon wesentlich komplizierter.
Ich rate dir daher zur FileInstall-Variante, probier sie einfach mal aus.
-
Die FileInstall-Funktion sorgt beim Kompilieren dafür, dass die Datei die du angibst in deine Exe eingeschrieben wird. Beim Start der Exe, wird die Datei dann in den vorgegebenen Pfad extrahiert, und steht dir zur Verfügung.
Dieses Wissen fehlte mir, ich hatte im Sinn, dass der Code für die Icons dann direkt in der .exe sein sollte und nicht wieder extrahiert wird. Das habe ich der AutoIt-Hilfe nicht entnehmen können, wenn ich das mit diesem Hintergrund jetzt noch mal lese, ist es klar.
Du könntest natürlich auch die Icons selber erzeugen (scheint ja nicht sonderlich kompliziert auszusehen) indem du Gdi+ anschmeißt aber ohne herablassend klingen zu wollen, scheint das über deinem Wissensstand zu liegen und ist schon wesentlich komplizierter.
Absolut richtig, noch nie benutzt und noch nicht mal eine Idee, wie das funktioniert. Ist es aufwendig - einfach zum Lernen - ein kurzes Beispiel für einen Kreis wie in meinem Bild zu machen? Wenn aufwendig - kein Problem. Könnte aber ja auch wieder eine Sache sein, die in AutoIt in 5 Zeilen erledigt ist.
-
ich hatte im Sinn, dass der Code für die Icons dann direkt in der .exe sein sollte und nicht wieder extrahiert wird.
(wie bereits 'zig mal in anderen Threads beschrieben)
Du könntest auch den beliebten file-to-base64-string-code-generator von UEZ verwenden.
Gruß Musashi
-
- Offizieller Beitrag
Hier mal ein Beispiel mit Base64-kodierten Daten:
AutoIt
Alles anzeigen#include <GDIPlus.au3> #include <GUIConstantsEx.au3> #include <SendMessage.au3> #include <StaticConstants.au3> #include <WinAPIHObj.au3> #include <WinAPIInternals.au3> _GDIPlus_Startup() Global $iSize = 32, $hResize, $hRed, $hGreen $hRed = _GDIPlus_BitmapCreateFromMemory(_redpng()) ; GDI+ Bitmap erstellen von Base64-Daten $hResize = _GDIPlus_ImageResize($hRed, $iSize, $iSize) ; auf gewuenschte Groesse skalieren ($hResize ist eine Kopie) _GDIPlus_BitmapDispose($hRed) ; $hRed kann weg $hRed = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hResize) ; $hResize von GDI+ nach GDI-Bitmap wandeln _GDIPlus_BitmapDispose($hResize) ; jetzt kann auch $hResize weg $hGreen = _GDIPlus_BitmapCreateFromMemory(_greenpng()) $hResize = _GDIPlus_ImageResize($hGreen, $iSize, $iSize) _GDIPlus_BitmapDispose($hGreen) $hGreen = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hResize) _GDIPlus_BitmapDispose($hResize) _GDIPlus_Shutdown() Global $hGui = GUICreate('Test', 240, 240) Global $idPic1 = GUICtrlCreatePic('', 10, 10, $iSize, $iSize) Global $idPic2 = GUICtrlCreatePic('', 10, 20 + $iSize, $iSize, $iSize) GUISetState() _SetImage($idPic1, $hRed) _SetImage($idPic2, $hGreen) Sleep(2000) _SetImage($idPic1, $hGreen) _SetImage($idPic2, $hRed) Do Until GUIGetMsg() = $GUI_EVENT_CLOSE _WinAPI_DeleteObject($hRed) _WinAPI_DeleteObject($hGreen) Func _SetImage(ByRef $idCtrl, ByRef $hImg) Local $hCtrl, $hPrevImage $hCtrl = GUICtrlGetHandle($idCtrl) $hPrevImage = _SendMessage($hCtrl, $STM_SETIMAGE, $IMAGE_BITMAP, $hImg) If $hPrevImage Then _WinAPI_DeleteObject($hPrevImage) EndFunc ;Code below was generated by: 'File to Base64 String' Code Generator v1.20 Build 2015-09-19 Func _greenpng($bSaveBinary = False, $sSavePath = @ScriptDir) Local $greenpng $greenpng &= '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' $greenpng &= 'eDH+C03pDPEhJjFDAAAAAElFTkSuQmCC' Local $bString = _WinAPI_Base64Decode($greenpng) If @error Then Return SetError(1, 0, 0) $bString = Binary($bString) If $bSaveBinary Then Local Const $hFile = FileOpen($sSavePath & "\green.png", 18) If @error Then Return SetError(2, 0, $bString) FileWrite($hFile, $bString) FileClose($hFile) EndIf Return $bString EndFunc ;==>_greenpng Func _redpng($bSaveBinary = False, $sSavePath = @ScriptDir) Local $redpng $redpng &= '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' $redpng &= '8aynZskAAAAASUVORK5CYII=' Local $bString = _WinAPI_Base64Decode($redpng) If @error Then Return SetError(1, 0, 0) $bString = Binary($bString) If $bSaveBinary Then Local Const $hFile = FileOpen($sSavePath & "\red.png", 18) If @error Then Return SetError(2, 0, $bString) FileWrite($hFile, $bString) FileClose($hFile) EndIf Return $bString EndFunc ;==>_redpng Func _WinAPI_Base64Decode($sB64String) Local $aCrypt = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryA", "str", $sB64String, "dword", 0, "dword", 1, "ptr", 0, "dword*", 0, "ptr", 0, "ptr", 0) If @error Or Not $aCrypt[0] Then Return SetError(1, 0, "") Local $bBuffer = DllStructCreate("byte[" & $aCrypt[5] & "]") $aCrypt = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryA", "str", $sB64String, "dword", 0, "dword", 1, "struct*", $bBuffer, "dword*", $aCrypt[5], "ptr", 0, "ptr", 0) If @error Or Not $aCrypt[0] Then Return SetError(2, 0, "") Return DllStructGetData($bBuffer, 1) EndFunc ;==>_WinAPI_Base64Decode
-
(wie bereits 'zig mal in anderen Threads beschrieben)
Wenn man weiß, mit welchen Begriffen man danach sucht ist das sicher einfach Mir hat bis eben GDI noch nichts gesagt außer dass es mal Drucker gab, die nur GDI-Druck konnten.
Du könntest auch den beliebten file-to-base64-string-code-generator von UEZ verwenden.
Das sieht sehr gut brauchbar aus, vermutlich hat Oscar das Beispiel auch damit erstellt!?
-
Hier mal ein Beispiel mit Base64-kodierten Daten:
Perfekt, funktioniert - danke.
-
- Offizieller Beitrag
vermutlich hat Oscar das Beispiel auch damit erstellt!?
Genau! Der Generator wird immer angeschmissen, wenn ich Binaries (Bilder, Musik oder Fonts) mit in die Exe packen will.
-
==> Zitat Musashi : "(wie bereits 'zig mal in anderen Threads beschrieben) ..."
Wenn man weiß, mit welchen Begriffen man danach sucht ist das sicher einfach
Hi HansJ54 !
Da hast Du mich wahrscheinlich falsch verstanden.
Ich wollte damit nicht sagen, Du müsstest das wissen oder hättest Dir keine Mühe gegeben .
Das Zitat sollte lediglich untermauern, dass der Base64-Generator von UEZ ein bewährtes Tool ist, und von vielen Usern genutzt wird wenn es um das Einbinden von Binärdateien geht.
Gruß Musashi
-
Da hast Du mich wahrscheinlich falsch verstanden.
Habe es auf jeden Fall nicht wirklich negativ aufgefasst und finde die Unterstützung hier absolut super! Auch wenn es manchmal vielleicht auf den ersten Blick dumme Fragen sind - hier bekommt man immer eine brauchbare Antwort.
Und ich kann den Generator jetzt zwar benutzen, aber tiefgründig verstehen will ich ihn glaube ich nicht, habe andere Probleme.
-
Hi HansJ54
Wie beschrieben ist der Base64-Generator der absolute Standard für die Aufgabe einfach super kompfortabel. Schau dir für Beispiele auch mal den Release im EN Forum an. Dort liefert UEZ gleich selbst ein paar tolle Anwendungsbeispiele: https://www.autoitscript.com/forum/topic/13…r-files-easily/
Was du dir auch ansehen solltest ist sein AutoIt Sysinternal Tools Synchronizer. Beim Ausprobieren eben gesehen, dass die Anzeige der Programme scheinbar nicht mehr funkioniert UEZ Aber da kannst du dir mal ansehen, wie du so ein Programm allgemein durchstylen kannst. -
Beim Ausprobieren eben gesehen, dass die Anzeige der Programme scheinbar nicht mehr funkioniert
Yep, die haben die Seite verändert, aber da das Interesse eher sehr gering ist, habe das Skript nicht aktualisiert.
-
Versteh ich. Für den oben genannten Zweck bleibt es aber auch so ein sehr beachtenswertes Skript.
-
Ich habe doch das Skript nochmals aktualisiert - diesmal aber zum letzten Mal.
Die Liste sollte von der Web Seite aktualisiert werden...
-
Habs ausprobiert. Beim Update läufts.
-
Bei mir auch, wäre schade wenn das Programm "untergehen" würde.