Bonjour Tlem (désolé pour le délai).
Merci pour ta réponse, même si ce n'est pas ce que je souhaitais entendre ^^ Je ne voulais pas utiliser AutoIt Wrapper, car par défaut il n'est pas présent dans une installation "classique" d'AutoIt (absent du package 3.3.6.1), donc tant pis si on ne peut pas faire autrement (c'était pour simplifier l'utilisation pour le "client" final, si c'est pour la compliquer au final en demandant installer encore un autre truc, je laisse tomber).
J'ai résolu mon problème en passant dans le code du programme un appel à la ligne de commande suivante :
Code : Tout sélectionner
"C:\Program Files\AutoIt\Aut2Exe\Aut2Exe.exe" /in U:\Script\Script.au3 /out C:\AutoIt\Executable.exe /icone U:\Images\Icone.ico /comp 4
depuis un sous-script, puisque bloquant si on souhaite un retour de code d'erreur, ou interrompre la compilation par une simple touche. Je vous fournis le code ci dessous, ça pourra toujours être utile à quelqu'un :
"Lancement Compilation.au3" :
► Afficher le texte
Code : Tout sélectionner
; Appel du script avec argument : "Lancement Compilation.au3" ligne [delai]
; [in] ligne [obligatoire] = ligne de commande transformée en hexadécimal
; [in] delai [optionnel] = delai
; [out] exit code = 0 : Arret normal
; [out] exit code = -1 : Interrompu par utilisateur
; [out] exit code = 1 : Argument invalide
; [out] exit code = 2 : Argument non conforme
; [out] exit code = 3 : Timeout atteint
#NoTrayIcon
; Programme en stand alone, ne pas faire de include de "Lancement Compilation.au3"
#Include <String.au3>
; Fonction d'arret par HotKey
Func force()
$force = True
EndFunc
; Argument en parametre d'exécution
If $cmdLine[0] <> 1 And $cmdLine[0] <> 2 Then Exit 1
; Initialisation du timer et du delai
Global $timer = TimerInit(), $force = False
Global $timerOriginal = $timer, $continue = True
Global $sleep = 500, $delai = 120000 ; 120.000 ms = 2 minutes
If $cmdLine[0] = 2 Then $delai = Number($cmdLine[2])
; Lancement du processus de compilation
Global $ligne = _HexToString($cmdLine[1])
If @error Then Exit 2
$PID = Run($ligne)
; Système d'arret forcé
HotKeySet("{F4}", "force")
; Vérification de la présence du processus Aut2exe (compilateur) et de la validité du timer (delai non atteint)
While $continue
Do
Sleep($sleep)
Until $force Or TimerDiff($timer) > $delai Or Not ProcessExists($PID)
If Not $force And TimerDiff($timer) > $delai And ProcessExists($PID) Then
$continue = (6 = MsgBox(4+48,"Compilation en cours","La commande de compilation suivante est en cours depuis plus de "&Int(TimerDiff($timerOriginal)/60000)&" minutes :"&@CRLF&$ligne&@CRLF&@CRLF&"Souhaitez vous continuer à attendre ?",30))
If $continue Then $timer = TimerInit()
Else
$continue = False
EndIf
WEnd
; Cas de retour du code d'erreur
If TimerDiff($timer) > $delai Then
ProcessClose($PID)
Exit 3
ElseIf $force = True Then
ProcessClose($PID)
Exit -1
Else
Exit 0
EndIf
A ajouter au script à compiler , exemple "Script.au3" :
► Afficher le texte
Code : Tout sélectionner
If 6 = MsgBox(48+4, "Compilation", "Cette opération peut durer plusieurs minutes,"&@CRLF&"le programme ne peut être utilisé en même temps."&@CRLF&@CRLF&"Lancer la compilation?",30) Then
TrayTip("Interface : Compilation", "Compilation du programme en cours,"&@CRLF&"peut prendre plusieurs minutes."&@CRLF&"(F4 : interrompre l'opération)", 30, 2)
Local $aut2exe = StringLeft(@AutoItExe,StringInStr(@AutoItExe,"\",0,-1))&"Aut2Exe\Aut2Exe.exe"
If FileExists($aut2exe) Then
GUISetState(@SW_HIDE,$GUI) ; Suspendre l'affichage de la GUI pendant la compilation
Local $resultat = compilationExecuter($aut2exe, @ScriptFullPath, @ScriptDir&"\executable.exe", "C:\Icone.ico", 4)
GUISetState(@SW_SHOW,$GUI) ; Reprendre l'affichage de la GUI
If $resultat = 0 Then
TrayTip("Interface : Compilation", "Compilation du programme effectuée", 30, 1)
Else
Local $raison = "Code inconnu"
If $resultat = 3 Then $raison = "Timeout atteint"
If $resultat = 2 Then $raison = "Argument non conforme"
If $resultat = 1 Then $raison = "Argument invalide"
If $resultat = -1 Then $raison = "Interrompu par utilisateur"
TrayTip("Interface : Compilation", "Compilation echouée (Exit code '"&$resultat&"' : "&$raison&")", 30, 3)
EndIf
Else
TrayTip("Interface : Compilation", "Compilation échouée : Aut2Exe introuvable"&@CRLF&"("&$aut2exe&")", 30, 3)
EndIf
Else
displayTooltip("Interface : Compilation", "Compilation du programme annulée")
EndIf
Fonction à ajouter à "Script.au3", pour faire l'interface :
► Afficher le texte
Code : Tout sélectionner
#Include <String.au3>
Func compilationExecuter($aut2exe, $source="", $destination="", $icone="", $compression=0)
$ligne = '"'&$aut2exe&'"'& _
cond(FileExists($source),' /in "'&$source&'"', ' /in "'&@ScriptFullPath&'"') & _
cond(String($destination),' /out "'&$destination&'"','') & _
cond(FileExists($icone),' /icon "'&$icone&'"','') & _
cond($compression <> 0, ' /comp '&$compression,'') & _
cond(@AutoItX64=1," /x64","")
If FileExists("Lancement Compilation.exe") Then
Return RunWait('"Lancement Compilation.exe" '&_StringToHex($ligne))
ElseIf FileExists("Lancement Compilation.au3") Then
Return RunWait(@AutoItExe&' "Lancement Compilation.au3" '&_StringToHex($ligne))
EndIf
Return 1
EndFunc
Merci encore ! Je passe le post en [R]ésolu.
ZDS
PS: il y a moyen de faire plus "simple", mais séparer les blocs de code réutilisable en fonction, et limiter les indentations à 5 TAB maximum, est une bonne méthode de prog, surtout en Java ^^
PS2: Ca peut paraitre bizarre comme code, mais on a le choix pour lancer la compilation entre Run (qui retourne le PID, mais permet de continuer le script) et RunWait (qui retourne le code de sortie, mais bloque le script). Ce bout de code permet de récupérer le code d'erreur de la compilation tout en continuant le script, et donc forcer son arrêt, utile quand c'est trop long.