SourcFile erstellen anstelle einer DLL-Datei

  • Mit folgendem Code können beliebig viele Dateien in eine einzige Datei zusammenkopiert werden. Das Skript erstellt außerdem den Code um die einzelnen Dateien im Bedarfsfall wieder in einzelne Dateien aufzusplitten. Dieser Code wird in die Zwischenablage kopiert und kann so in einem anderen Skript eingefügt werden. Die neu erstellte Datei SourceFile.dll sollte auch in das Verzeichnis des anderen Skriptes kopiert werden.

    Ich hoffe, dass meine Erklärung zu dem Skript verständlich ist und dass jemand dafür Verwendung findet. Ich brauche nun nicht mehr mit dem Resource-Hacker eine richtige dll-Datei zu erstellen, in denen meine Bilder, Avi's gespeichert sind, sondern nur noch dieses Skript.

    Meldet euch bei Problemen oder Fragen, aber auch bei Kritik (hoffentlich positiv)

    Make SourceFile.au3
    [autoit]

    #cs ----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    AutoIt Version: 3.2.12.1
    Author: funkey
    Release Date: 10. Dec. 2008
    Version: 1.2
    Script Function:
    Dieses Skript packt alle ausgewählten Resourcen in die Datei 'SourceFile.src'.
    Es wird der zum Zerlegen der Datei benötigte Code automatisch generiert und
    in der Zwischenablage gespeichert.

    Dieser Code wird dann in das Skript eingefügt, in dem die Resourcen benötigt
    werden. Die Dateien können dann wie im folgenden Beispiel verwendet werden.
    Bsp.: GUICtrlCreateIcon($Source_File_1, -1, 5,5, 32,32)
    GUICtrlCreateIcon($Source_File_2, -1, 55,55, 32,32)
    GUICtrlCreateAvi(Source_File_3, -1, 100, 5, 50, 50)
    GUICtrlCreatePic(Source_File_4, 5, 200)

    Die zur Laufzeit des Skriptes entstehenden Dateien werden im temporären Ordner
    erstellt und sollten beim Beenden des Skriptes wieder gelöscht werden.
    Bsp.: FileDelete($Source_File_1)
    FileDelete($Source_File_2)
    FileDelete($Source_File_3)
    FileDelete($Source_File_4)

    [/autoit] [autoit][/autoit] [autoit]

    #ce ----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    Local $Dummy, $Sources, $Dateien = '"', $SourceFile = '"'&@ScriptDir&'\SourceFile.src"', $Result = ""

    [/autoit] [autoit][/autoit] [autoit]

    Do
    $Sources = FileOpenDialog("Resourcen wählen", @ScriptDir, "Alle Dateien (*.*)|Bilder (*.jpg;*.bmp)|Videos (*.avi)|Icons (*.ico)|Executables (*.exe)|DLL's (*.dll)", 5)
    If $Sources = "" Then ExitLoop
    If StringInStr($Sources, "|") = 0 Then
    $Dateien &= $Sources&'" + "'
    Else
    $Dummy = StringSplit($Sources, "|")
    For $i = 2 To $Dummy[0]
    $Dateien &= $Dummy[1]&'\'&$Dummy[$i]&'" + "'
    Next
    EndIf
    Until MsgBox(36, "Weitere Dateien hinzufügen", "Willst du noch weitere Dateien zur Source-Datei hinzufügen?") = 7

    [/autoit] [autoit][/autoit] [autoit]

    $Dateien = StringTrimRight($Dateien, 4)
    $aDateien = StringSplit(StringTrimRight(StringTrimLeft($Dateien,1),1), '" + "', 1)

    [/autoit] [autoit][/autoit] [autoit]

    $SourceFile = Run(@ComSpec & " /c " & 'copy /b '&$Dateien&" "&$SourceFile, "", @SW_HIDE)

    [/autoit] [autoit][/autoit] [autoit]

    Local $aSize[$aDateien[0]]
    For $i = 1 To $aDateien[0]
    $aSize[$i-1] = FileGetSize($aDateien[$i])
    Next

    [/autoit] [autoit][/autoit] [autoit]

    $Result = "#Region 'Make SourceFile.au3'"&@CRLF
    $Result &= "$Datei = FileOpen(@ScriptDir&'\SourceFile.src', 4)"&@CRLF
    For $i = 1 To $aDateien[0]
    $Result &= "$Source_"&$i&" = FileRead($Datei, "&$aSize[$i-1]&") ;Dateigröße nicht verändern!"&@CRLF
    $Result &= "Do"&@CRLF
    $Result &= " $Source_File_"&$i&" = @TempDir & '\temp' & Hex(Random(0, 65535), 4) ;"&$aDateien[$i]&@CRLF
    $Result &= "Until Not FileExists($Source_File_"&$i&")"&@CRLF
    $Result &= "$TempFile_"&$i&" = FileOpen($Source_File_"&$i&", 18)"&@CRLF
    $Result &= "FileWrite($TempFile_"&$i&", $Source_"&$i&")"&@CRLF
    $Result &= "FileClose($TempFile_"&$i&")"&@CRLF
    Next
    $Result &= "FileClose($Datei)"&@CRLF
    $Result &= "#EndRegion 'Make SourceFile.au3'"

    [/autoit] [autoit][/autoit] [autoit]

    ClipPut($Result)

    [/autoit]


    Edit: Version 1.2 : Bug ausgemerzt. Es mussten immer mehr als eine Datei ausgewählt werden.
    Kommentar hinzugefügt, Filter nochmals erweitert.


  • Hast Du für Deine Lösung auch ein Examples (Beispiel) ? ;)

    Ja, ein Beispiel wäre sehr gut und evtl. auch eines wie man es anwendet.
    Kann man das ganze noch erweitern z. B. um andere EXE-Dateien mit in die *.dll zu stecken?

    LG,
    Alina.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Man kann den Filter von FileOpenDialog natürlich auch für exe-Dateien, au3-Dateien und alles was irgendwie nützlich ist erweitern.

    Das Skript liefert mehr oder weniger schon ein Beispiel mit dem Code der in die Zwischenablage geschrieben wird.

    [autoit]

    Code vom Skript erzeugt

    [/autoit][autoit][/autoit][autoit]

    GUICtrlCreateAvi($Source_File_1, ...........)
    GUICtrlCreatePic($Source_File_2, ...........)
    Run($Source_File_3)

    [/autoit]

    Der Vorteil dieser Methode zu dem eine richtige DLL zu verwenden ist, wie Alina schon bemerkt hat, dass man beliebige Dateitypen in einer Datei unterbringen kann. So in der Art wie ein unkomprimiertes Archiv.

    RR04: Ich kenne deine Projekte ;)

  • Beispiel mit 2 Icons
    [autoit]

    #Region Make SourceFile

    [/autoit] [autoit][/autoit] [autoit]

    $Datei = FileOpen(@ScriptDir&'\SourceFile.dll', 4)
    $Source_1 = FileRead($Datei, 106570)
    Do
    $Source_File_1 = @TempDir & '\temp' & Hex(Random(0, 65535), 4) ;C:\Dokumente und Einstellungen\funkey\Desktop\Test\Update.ico
    Until Not FileExists($Source_File_1)
    $TempFile_1 = FileOpen($Source_File_1, 18)
    FileWrite($TempFile_1, $Source_1)
    FileClose($TempFile_1)
    $Source_2 = FileRead($Datei, 4286)
    Do
    $Source_File_2 = @TempDir & '\temp' & Hex(Random(0, 65535), 4) ;C:\Dokumente und Einstellungen\funkey\Desktop\Test\Game.ico
    Until Not FileExists($Source_File_2)
    $TempFile_2 = FileOpen($Source_File_2, 18)
    FileWrite($TempFile_2, $Source_2)
    FileClose($TempFile_2)
    FileClose($Datei)

    [/autoit] [autoit][/autoit] [autoit]

    #EndRegion Make SourceFile

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    #include <GUIConstantsEx.au3>

    [/autoit] [autoit][/autoit] [autoit]

    GUICreate("Test Make SourceFile")

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlCreateIcon($Source_File_1, -1, 5,5, 32,32)
    GUICtrlCreateIcon($Source_File_2, -1, 55,55, 32,32)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $msg = GUIGetMsg()
    If $msg = $GUI_EVENT_CLOSE Then ExitLoop
    WEnd

    [/autoit]

    Der Code in der Region wird von meinem Script erstellt.

  • Also ich kann dazu nur schreiben, das bei mir weder eine DLL ersterllt wird, noch das mehr passiert, als das ich abgefragt werde, welche Dateien ich einbinden möchte.

    Entweder funktioniert es NOCH nicht oder es ist eine Gebrauchsanweisung notwendig.

    Die Idee selber, das man eine DLL mit AutoIt erstellt finde ich jedoch sehr gut. Möglichst viel mit AutoIt machen um sich oder anderen das Leben leichter zu machen als es ist ;)

    In diesem Sinne: Nur nicht aufgeben.

    LG,
    Alina.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Alina: Es wird keine richtige DLL-Datei erstellt, sondern es wird einfach eine Binärdatei erstellt mit dem Namen SourceFile.dll. Besser wäre es wahrscheinlich wenn die Datei SourceFile.bin oder SourceFile.src heißen würde. Das spielt aber keine Rolle (kann jeder ändern wie er will). Fakt ist, dass man nichts sieht, außer dass man Dateien auswählen kann. Wenn man alle Dateien ausgewählt hat, dann wird die beschriebene Datei im selben Ordner wie die 'Make SourceFile.au3' erstellt und in die Zwischenablage wird der Code kopiert, denn man in einem anderen Skript verwenden kann. Bei diesem Code darf man dann die Variablennamen anpassen, wenn man will, aber man darf keine Datei weglassen, da sonst nichts mehr funktioniert und FileRead falsche Daten aus der Binärdatei ausliest.

    Ich habe den Code noch ein wenig erweitert, damit man auch exe-Dateien und 'Alle Dateien' auswählen kann. Außerdem wird der in die Zwischenablage kopierte Code in eine #Region 'Make SourceFile.au3' geschrieben, damit man in Scite einfach diesen Teil des Skripts ausblenden kann!

    Make SourceCode.au3 Version 1.1 mit Filteranpassungen und Ausgabe in eine Region
    [autoit]

    Local $Dummy, $Sources, $Dateien = '"', $SourceFile = '"'&@ScriptDir&'\SourceFile.dll"', $Result = ""

    [/autoit] [autoit][/autoit] [autoit]

    Do
    $Sources = FileOpenDialog("Resourcen wählen", @ScriptDir, "Bilder (*.jpg;*.bmp)|Videos (*.avi)|Icons (*.ico)|Executables (*.exe)|Alle Dateien (*.*)", 5)
    If $Sources = "" Then ExitLoop
    $Dummy = StringSplit($Sources, "|")
    For $i = 2 To $Dummy[0]
    $Dateien &= $Dummy[1]&'\'&$Dummy[$i]&'" + "'
    Next
    Until MsgBox(36, "Weitere Dateien hinzufügen", "Willst du noch weitere Dateien zur Source-Datei hinzufügen?") = 7

    [/autoit] [autoit][/autoit] [autoit]

    $Dateien = StringTrimRight($Dateien, 4)
    $aDateien = StringSplit(StringTrimRight(StringTrimLeft($Dateien,1),1), '" + "', 1)

    [/autoit] [autoit][/autoit] [autoit]

    $SourceFile = Run(@ComSpec & " /c " & 'copy /b '&$Dateien&" "&$SourceFile, "", @SW_HIDE)

    [/autoit] [autoit][/autoit] [autoit]

    Local $aSize[$aDateien[0]]
    For $i = 1 To $aDateien[0]
    $aSize[$i-1] = FileGetSize($aDateien[$i])
    Next

    [/autoit] [autoit][/autoit] [autoit]

    $Result = "#Region 'Make SourceFile.au3'"&@CRLF
    $Result &= "$Datei = FileOpen(@ScriptDir&'\SourceFile.dll', 4)"&@CRLF
    For $i = 1 To $aDateien[0]
    $Result &= "$Source_"&$i&" = FileRead($Datei, "&$aSize[$i-1]&")"&@CRLF
    $Result &= "Do"&@CRLF
    $Result &= " $Source_File_"&$i&" = @TempDir & '\temp' & Hex(Random(0, 65535), 4) ;"&$aDateien[$i]&@CRLF
    $Result &= "Until Not FileExists($Source_File_"&$i&")"&@CRLF
    $Result &= "$TempFile_"&$i&" = FileOpen($Source_File_"&$i&", 18)"&@CRLF
    $Result &= "FileWrite($TempFile_"&$i&", $Source_"&$i&")"&@CRLF
    $Result &= "FileClose($TempFile_"&$i&")"&@CRLF
    Next
    $Result &= "FileClose($Datei)"&@CRLF
    $Result &= "#EndRegion 'Make SourceFile.au3'"

    [/autoit] [autoit][/autoit] [autoit]

    ClipPut($Result)

    [/autoit] [autoit][/autoit] [autoit][/autoit]

    lg funkey

    P.S. Wenn noch Fragen sind, dann nur her damit! ;)

    Download siehe Post #1

  • Hi Funkey,
    2x Icon und ein Avi erstellen ist nun möglich, nach Script und Dateigrösse.
    Die Darstellung funktioniert jedoch noch nicht ? ;(

    Spoiler anzeigen
    [autoit]


    #Region 'Make SourceFile.au3'
    $Datei = FileOpen(@ScriptDir&'\SourceFile.dll', 4)
    $Source_1 = FileRead($Datei, 248404)
    Do
    $Source_File_1 = @TempDir & '\temp' & Hex(Random(0, 65535), 4) ;C:\TEST_DLL\rdgo.avi
    Until Not FileExists($Source_File_1)
    $TempFile_1 = FileOpen($Source_File_1, 18)
    FileWrite($TempFile_1, $Source_1)
    FileClose($TempFile_1)
    $Source_2 = FileRead($Datei, 3774)
    Do
    $Source_File_2 = @TempDir & '\temp' & Hex(Random(0, 65535), 4) ;C:\TEST_DLL\compile.ico
    Until Not FileExists($Source_File_2)
    $TempFile_2 = FileOpen($Source_File_2, 18)
    FileWrite($TempFile_2, $Source_2)
    FileClose($TempFile_2)
    $Source_3 = FileRead($Datei, 1694)
    Do
    $Source_File_3 = @TempDir & '\temp' & Hex(Random(0, 65535), 4) ;C:\TEST_DLL\info.ico
    Until Not FileExists($Source_File_3)
    $TempFile_3 = FileOpen($Source_File_3, 18)
    FileWrite($TempFile_3, $Source_3)
    FileClose($TempFile_3)
    FileClose($Datei)
    #EndRegion 'Make SourceFile.au3'

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    #include <GUIConstantsEx.au3>

    [/autoit] [autoit][/autoit] [autoit]

    GUICreate("Test Make SourceFile", 500, 500, -1, 130)

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlCreateAvi($Source_File_1, -1, 24, 10, 100, 100)
    GUICtrlCreateIcon($Source_File_2, -1, 15,15, 32,32)
    GUICtrlCreateIcon($Source_File_3, -1, 50,50, 32,32)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $msg = GUIGetMsg()
    If $msg = $GUI_EVENT_CLOSE Then ExitLoop
    WEnd
    ; Ende

    [/autoit]


    Allen schöne Feiertage ! :)

  • Danke RitzelRocker fürs Testen. Ich hatte noch einen Bug im Skript, so dass mind. 2 Dateien ausgewählt werden mussten, damit es richtig funktionierte. Bei mir funktioniert es mit Bildern und Icons. Mit einer AVI habe ich es noch nicht getestet, werde ich aber gleich machen.

    Im Post #1 gibt's Version 1.2 zum Download.


    Edit: @RitzelRocker: Es geht einwandfrei auch mit AVI's (Deiner aus SiS ;) )

    Spoiler anzeigen
    [autoit]

    #Region 'Make SourceFile.au3'
    $Datei = FileOpen(@ScriptDir&'\SourceFile.src', 4)
    $Source_1 = FileRead($Datei, 106570) ;Dateigröße nicht verändern!
    Do
    $Source_File_1 = @TempDir & '\temp' & Hex(Random(0, 65535), 4) ;C:\Dokumente und Einstellungen\funkey\Desktop\Make SourceFile\Update.ico
    Until Not FileExists($Source_File_1)
    $TempFile_1 = FileOpen($Source_File_1, 18)
    FileWrite($TempFile_1, $Source_1)
    FileClose($TempFile_1)
    $Source_2 = FileRead($Datei, 4286) ;Dateigröße nicht verändern!
    Do
    $Source_File_2 = @TempDir & '\temp' & Hex(Random(0, 65535), 4) ;C:\Dokumente und Einstellungen\funkey\Desktop\Make SourceFile\Game.ico
    Until Not FileExists($Source_File_2)
    $TempFile_2 = FileOpen($Source_File_2, 18)
    FileWrite($TempFile_2, $Source_2)
    FileClose($TempFile_2)
    $Source_3 = FileRead($Datei, 377332) ;Dateigröße nicht verändern!
    Do
    $Source_File_3 = @TempDir & '\temp' & Hex(Random(0, 65535), 4) ;C:\Dokumente und Einstellungen\funkey\Desktop\Make SourceFile\SIS.avi
    Until Not FileExists($Source_File_3)
    $TempFile_3 = FileOpen($Source_File_3, 18)
    FileWrite($TempFile_3, $Source_3)
    FileClose($TempFile_3)
    FileClose($Datei)
    #EndRegion 'Make SourceFile.au3'

    [/autoit] [autoit][/autoit] [autoit]

    #include <GUIConstantsEx.au3>

    [/autoit] [autoit][/autoit] [autoit]

    GUICreate("Test Make SourceFile")

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlCreateIcon($Source_File_1, -1, 5,5, 32,32)
    GUICtrlCreateIcon($Source_File_2, -1, 55,55, 32,32)
    GUICtrlCreateAvi($Source_File_3, -1, 5, 100)
    GUICtrlSetState(-1, 1)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $msg = GUIGetMsg()
    If $msg = $GUI_EVENT_CLOSE Then ExitLoop
    WEnd

    [/autoit]
  • bei mir leider keine Darstellung. Was könnte ich falsch gemacht haben ?

    Spoiler anzeigen
    [autoit]


    #Region 'Make SourceFile.au3'
    $Datei = FileOpen(@ScriptDir&'\SourceFile.src', 4)
    $Source_1 = FileRead($Datei, 1694) ;Dateigröße nicht verändern!
    Do
    $Source_File_1 = @TempDir & '\temp' & Hex(Random(0, 65535), 4) ;C:\TEST_DLL\info.ico
    Until Not FileExists($Source_File_1)
    $TempFile_1 = FileOpen($Source_File_1, 18)
    FileWrite($TempFile_1, $Source_1)
    FileClose($TempFile_1)
    $Source_2 = FileRead($Datei, 3774) ;Dateigröße nicht verändern!
    Do
    $Source_File_2 = @TempDir & '\temp' & Hex(Random(0, 65535), 4) ;C:\TEST_DLL\compile.ico
    Until Not FileExists($Source_File_2)
    $TempFile_2 = FileOpen($Source_File_2, 18)
    FileWrite($TempFile_2, $Source_2)
    FileClose($TempFile_2)
    $Source_3 = FileRead($Datei, 248404) ;Dateigröße nicht verändern!
    Do
    $Source_File_3 = @TempDir & '\temp' & Hex(Random(0, 65535), 4) ;C:\TEST_DLL\rdgo.avi
    Until Not FileExists($Source_File_3)
    $TempFile_3 = FileOpen($Source_File_3, 18)
    FileWrite($TempFile_3, $Source_3)
    FileClose($TempFile_3)
    FileClose($Datei)
    #EndRegion 'Make SourceFile.au3'

    [/autoit] [autoit][/autoit] [autoit]

    #include <GUIConstantsEx.au3>

    [/autoit] [autoit][/autoit] [autoit]

    GUICreate("Test Make SourceFile")

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlCreateIcon($Source_File_1, -1, 5,5, 32,32)
    GUICtrlCreateIcon($Source_File_2, -1, 55,55, 32,32)
    GUICtrlCreateAvi($Source_File_3, -1, 5, 100)
    GUICtrlSetState(-1, 1)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $msg = GUIGetMsg()
    If $msg = $GUI_EVENT_CLOSE Then ExitLoop
    WEnd

    [/autoit]