Skripte als 32bit und 64bit kompilieren

  • Ich will eine au3 Datei in eine exe kompilieren.
    Diese soll als 32bit und 64bit Version erstellt werden.

    Wenn ich das folgende Skript unter Win XP 32bit starte klappt es.
    Wenn ich es jedoch unter Win 7 64bit starte, erhalte ich 2x eine 64bit Version

    Im Original Aut2exe gibt es den Parameter /X86.
    Da ich jedoch SciTE installiert habe, mußte ich feststellen, dass es diesen Parameter dort nicht mehr gibt :S

    Spoiler anzeigen
    [autoit]

    $wrapper_32bit = "C:\Programme\AutoIt3\SciTE\AutoIt3Wrapper\AutoIt3Wrapper.exe"
    $wrapper_64bit = "C:\Program Files (x86)\AutoIt3\SciTE\AutoIt3Wrapper\AutoIt3Wrapper.exe"

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

    If @OSArch = "X86" Then
    $wrapper = $wrapper_32bit
    ElseIf @OSArch = "X64" Then
    $wrapper = $wrapper_64bit
    EndIf

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

    $pfad = "C:\"
    $dateiname = "test01.au3"

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

    $pfad_komplett_au3 = $pfad & "\" & $dateiname
    $pfad_komplett_exe = StringTrimRight($pfad_komplett_au3, 4)

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

    $pfad_komplett_exe_32bit = $pfad_komplett_exe & "_32bit.exe"
    $pfad_komplett_exe_64bit = $pfad_komplett_exe & "_64bit.exe"

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

    ShellExecuteWait($wrapper, "/in " & '"' & $pfad_komplett_au3 & '"' & " /out " & '"' & $pfad_komplett_exe_32bit & '"'); & " /x86")
    ShellExecuteWait($wrapper, "/in " & '"' & $pfad_komplett_au3 & '"' & " /out " & '"' & $pfad_komplett_exe_64bit & '"' & " /x64")

    [/autoit]

    Oder übersehe ich da was?

  • So sollte es gehen:

    [autoit]


    #AutoIt3Wrapper_Run_Before=del /f /q %scriptfile%_x64.exe
    #AutoIt3Wrapper_Run_Before=del /f /q %scriptfile%_x86.exe
    #AutoIt3Wrapper_Run_Before="%autoitdir%\aut2exe\aut2exe.exe" /in %in% /out %scriptfile%_x64.exe /nopack /x64
    #AutoIt3Wrapper_UseX64=n
    #AutoIt3Wrapper_Run_After=ren %out% %scriptfile%_x86.exe

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

    If @OSArch = "X86" Then
    MsgBox(0, "CPU", "CPU is x86", 10)
    Else
    MsgBox(0, "CPU", "CPU is x64", 10)
    EndIf

    [/autoit]

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

    2 Mal editiert, zuletzt von UEZ (2. September 2010 um 09:10)

  • Leider ist dies nicht die Lösung nach der ich suche.

    Mein Problem ist, dass ich per Kommandozeile unter Win 7 64bit keine 32bit Version erzeugen kann, da bei der AutoIt3Wrapper.exe der Paramter /x86 fehlt.
    Wird kein Parameter angegeben, so wird automatisch eine 64bit Version erzeugt.

  • In meiner VM unter Win7 x64 werden beide Exe erstellt!

    Ich hatte heute morgen noch eine Zeile hinzugefügt, die ich nachts vergessen hatte, genau um dein beschriebenes Problem zu umgehen! :whistling:

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Wollte das ganze nochmal testen.
    Irgendwie wird nur noch eine 32bit Version mit der Endung "_32bit" erstellt.

    Was mache ich falsch?

    [autoit]

    #AutoIt3Wrapper_Run_Before=del /f /q "%scriptfile%_64bit.exe"
    #AutoIt3Wrapper_Run_Before=del /f /q "%scriptfile%_32bit.exe"
    #AutoIt3Wrapper_Run_Before="%autoitdir%\aut2exe\aut2exe.exe" /in "%in%" /out "%scriptfile%_64bit.exe" /nopack /x64
    #AutoIt3Wrapper_UseX64=n
    #AutoIt3Wrapper_Run_After=ren "%out%" "%scriptfile%_32bit.exe"

    [/autoit]
  • Dann sieht es so aus, dass die Zeile
    #AutoIt3Wrapper_Run_Before="%autoitdir%\aut2exe\aut2exe.exe" /in "%in%" /out "%scriptfile%_64bit.exe" /nopack /x64
    nicht ausgeführt wird.

    Was sagt denn die Console von SciTE?

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Vielleicht stimmt auch einfach das Verzeichnis nicht. Versuche es also mal so.

    [autoit]


    #AutoIt3Wrapper_Run_Before=del /f /q "%scriptdir%\%scriptfile%_64bit.exe"
    #AutoIt3Wrapper_Run_Before=del /f /q "%scriptdir%\%scriptfile%_32bit.exe"
    #AutoIt3Wrapper_Run_Before="%autoitdir%\aut2exe\aut2exe.exe" /in "%in%" /out "%scriptdir%\%scriptfile%_64bit.exe" /nopack /x64
    #AutoIt3Wrapper_UseX64=n
    #AutoIt3Wrapper_Run_After=ren "%out%" "%scriptdir%\%scriptfile%_32bit.exe"

    [/autoit]

    PS: Beim AutoIt3Wrapper kannst du auch "nicht x64" angeben. Wenn man den Quellcode anschaut, steht da folgendes:
    /Unicode -> x64=False, ANSI=False
    /x64 -> x64 = True, ANSI=False

    Also ist /Unicode für x86 und /x64 für 64bit ;)

  • Steh grad aufm Schlauch :S
    Was soll ich wie testen?

    Wenn du F7 drückst, werden doch die Befehle im unteren Fenster von SciTE ausgegeben. Dort kannst du auch die Fehler beim Erstellen der Exe sehen.

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Es kommt bei UEZ und progandy (getestet unter XP 32bit)


    So würde es unter XP 32bit und 7 64bit funktionieren

    [autoit]

    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Run_Before=del /f /q "%scriptfile%_64bit.exe"
    #AutoIt3Wrapper_Run_Before=del /f /q "%scriptfile%_32bit.exe"
    #AutoIt3Wrapper_Run_Before=%autoitdir%\aut2exe\aut2exe.exe /in "%in%" /out "%scriptfile%_64bit.exe" /nopack /x64
    #AutoIt3Wrapper_Run_Before=%autoitdir%\aut2exe\aut2exe.exe /in "%in%" /out "%scriptfile%_32bit.exe" /nopack
    #AutoIt3Wrapper_Run_After=del "%scriptfile%.exe"
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

    [/autoit]

    Leider ist unter 7 64bit die Variable "%autoitdir%\aut2exe\aut2exe.exe" "C:\Program Files (x86)\AutoIt3\aut2exe\aut2exe.exe". Dann kommt der Fehler
    "Der Befehl "C:\Program" ist entweder falsch geschrieben oder konnte nicht gefunden werden."
    Wenn ich die "aut2exe.exe" direkt auf C:\kopiere und den Pfad direkt angebe klappt es.
    Wie kann ich bei "%autoitdir%" Leerzeichen zulassen?


    Meine jetzige Lösung ist ja:
    Datei 1 64bit erstellen
    Datei 2 32bit erstellen
    Datei 3 erstellen je nachdem ob OS 32bit oder 64bit ist
    Datei 3 wieder löschen

    Wie kann ich den 3. und 4. Schritt vermeiden?

  • Ich würde dir vorschlagen, ein AutoIt-Skript zu schreiben, das die nötigen Aufgaben erledigt ;)
    Also in etwa so:
    - dein normales Skript hat keine x64-Angabe
    - es wird kontrolliert, ob x64 oder x86 erstellt wurde
    - die Datei wird entsprechend umbenannt
    - dann wird die andere Version erstellt (per passendem Parameter für AutoitWrapper, /Unicode oder /x64)
    - zuletzt die Datei richtig benennen.

  • Hi, ich habe keine Ahnung warum der Wrapper da keine Leerzeichen erlaubt.

    Das wäre mein Vorschlag, um x86 und x64 zu erstellen:

    Spoiler anzeigen
    [autoit]

    ; (C) by ProgAndy
    ; compile x64 and x86 at the same time.
    ; put BiCompile.exe in %PATH% add the following to your script:
    ; #AutoIt3Wrapper_Run_After=bicompile.exe "%scitedir%" "%in%" "%out%"
    ; DO NOT ADD #AutoIt3Wrapper_UseX64 OR IT WILL NOT WORK

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

    #include<Misc.au3>

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

    Func __GetBinaryType($sFile)
    Local $aRes = DllCall("kernel32.dll", "bool", "GetBinaryTypeW", "wstr", $sFile, "dword*", 0)
    If @error Then Return SetError(1, 0, 0)
    Return SetExtended($aRes[2], $aRes[0])
    EndFunc ;==>__GetBinaryType

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

    If $CMDLINE[0] = 3 Then
    $sSciteDir = $CMDLINE[1]
    $sAu3 = $CMDLINE[2]
    $sFile = $CMDLINE[3]
    _Singleton("BiCompile" & StringReplace($sFile, "\", ""))
    If Not __GetBinaryType($sFile) Then
    ConsoleWrite(@ScriptName & ": invalid outfile:" & $sFile & @CRLF)
    Exit
    EndIf
    Switch @extended
    Case 1 To 5
    ConsoleWrite(@ScriptName & ": Neither x64 nor x86: " & $sFile & @CRLF)
    Exit
    Case 0 ; already compiled x86, now do x64
    ConsoleWrite(@ScriptName & ': Successfully compiled x86' & @CRLF)
    _CompileAs(True, $sAu3, $sFile, $sSciteDir)
    Case 6 ; already compiled x64, now do x86
    ConsoleWrite(@ScriptName & ': Successfully compiled x64' & @CRLF)
    _CompileAs(False, $sAu3, $sFile, $sSciteDir)
    EndSwitch
    Else
    ConsoleWrite(@ScriptName & ": Wrong parameter Count" & @CRLF)
    EndIf

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

    Func _CompileAs($fX64, $sAu3, $sFile, $sSciteDir, $fRetry=True)
    $fX64 = True = $fX64
    Local $a[2][5] = [ _
    [0, 6, 'x64', 'x86', '/Unicode'], _
    [6, 0, 'x86', 'x64', '/x64'] _
    ]
    FileMove($sFile, StringRegExpReplace($sFile, "\.([^\.]*)$", "_" & $a[$fX64][2] & ".$1"))
    RunWait(StringFormat('"%s" /in "%s" %s', $sSciteDir & '\AutoIt3Wrapper\AutoIt3Wrapper.exe', $sAu3, $a[$fX64][4]))
    If __GetBinaryType($sFile) And @extended = $a[$fX64][0] Then
    ConsoleWrite(@ScriptName & ': Successfully compiled ' & $a[$fX64][3] & @CRLF)
    FileMove($sFile, StringRegExpReplace($sFile, "\.([^\.]*)$", "_" & $a[$fX64][3] & ".$1"))
    Else
    If $fRetry Then
    ConsoleWrite(@ScriptName&': Could not compile ' & $a[$fX64][3] & " - Trying to remove #AutoIt3Wrapper_UseX64" & @CRLF)
    $sData = StringRegExpReplace(FileRead($sAu3), "(?i)(?m)^\h*#AutoIt3Wrapper_UseX64.*$", "")
    $hFile = FileOpen($sAu3, 2)
    FileWrite($hFile, $sData)
    FileClose($hFile)
    _CompileAs($fX64, $sAu3, $sFile, $sSciteDir, False)
    Else
    ConsoleWrite(@ScriptName & ': Could not compile ' & $a[$fX64][3] & @CRLF)
    FileDelete($sFile)
    EndIf
    EndIf
    EndFunc ;==>_CompileAs

    [/autoit]
  • Das keiner drauf gekommen ist :whistling:

    [autoit]


    #AutoIt3Wrapper_Run_Before=del /f /q "%scriptfile%_x64.exe"
    #AutoIt3Wrapper_Run_Before=del /f /q "%scriptfile%_x86.exe"
    #AutoIt3Wrapper_Run_Before=""%autoitdir%\aut2exe\aut2exe.exe" /in "%in%" /out "%scriptdir%\%scriptfile%_x64.exe" /nopack /x64"
    #AutoIt3Wrapper_UseX64=n
    #AutoIt3Wrapper_Run_After=ren "%out%" "%scriptfile%_x86.exe"

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

    If @OSArch = "X86" Then
    MsgBox(0, "CPU", "CPU is x86", 10)
    Else
    MsgBox(0, "CPU", "CPU is x64", 10)
    EndIf

    [/autoit]

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • UEZ: Mein AutoItWrapper nimmt die Kommandozeilenparameter nicht, wenn im Skript schon #AutoIt3Wrapper_UseX64 festgelegt wird. Das war nämlich auch meine erste Idee (Man könnte natürlich auch die Priorität der Parameter im Wrapper ändern statt das extra Skript zu erstellen)