Suite à ce sujet, j'ai eu l'idée de créer un UDF qui permettrait de créer des extensions d'applications en AutoIt (pour AutoIt) et de pouvoir les utiliser par le biais d'un autre script (comme les DLLs pour Windows).
Donc, voici l'UDF :
► Afficher le texte
Code : Tout sélectionner
#include-once
#cs
*
* Fichier de gestion d'extensions d'application AutoIt
*
* Contient les fonctions utiles à la création d'une
* extension et à l'utilisation d'une extension.
*
* Attention : Les fichiers inclus, les paramètres, les
* variables et toutes les modifications
* apportés par l'extension d'application
* n'ont aucun effet sur le script qui les
* appelles. Seul la valeur de retour de la
* fonction est disponnible.
*
* Version : 1.0
* Date : 02/02/2013
* Auteur : TT22
*
#ce
; Paramètres de lancement d'une application...
; "File.ext" "Nombre de paramètres" "Param n°x" "Nom de la fonction"
; Fonction : _AAEInit ( [$Function])
; Initialise la création d'une extension d'application.
; Paramètres : $Function : Nom de la fonction à appeller au
; chargement de l'exentsion (facultatif).
; Retour : Aucun.
Func _AAEInit ( $Function = False)
; Définis l'appel de la fonction de fin de script...
OnAutoItExitRegister("__AAEExitNotRequired")
; Récupère les paramètres...
If $CmdLine[0] = 0 Then
_AAEExit (0, 1)
EndIf
Dim $aArgs[$CmdLine[1]+1]
$aArgs[0] = "CallArgArray"
For $i = 2 To $CmdLine[1]+1 Step 1
$Param = StringReplace($CmdLine[$i],"\a",'"')
$aArgs[$i-1] = StringReplace($Param,"\\ ","\")
Next
; Appel la fonction de démarrage...
If $Function Then
Call ( $Function)
; Cherche une erreur...
If @error = 0xDEAD Then _AAEExit (0, 2)
EndIf
; Cherche si une fonction doit être appelé...
If $CmdLine[$CmdLine[0]] <> "false" Then
; Appel la fonction...
$Return = Call ( $CmdLine[$CmdLine[0]], $aArgs)
; Cherche une erreur...
If @error = 0xDEAD Then _AAEExit (0, 3)
Else
$Return = 0
EndIf
; Quitte le script...
_AAEExit ( $Return, 0)
EndFunc
; Fonction : _AAECall ( $File, [$Function, [$Parameters]])
; Appel une fonction dans une extension AAE.
; Paramètres : $File : Chemin d'accès vers le fichier
; d'extension. Ce fichier doit être
; un script AutoIt. Il peut être compilé
; ou non (a3x et exe pris en charge).
; $Function : Nom de la fonction à appeller dans
; l'extension.
; $Parameters : Un tableau contenant les paramètres
; (de type "special array argument", voir
; l'exemple de la fonction "Call").
; Retour : Le retour de la fonction appelé si succès.
; 0 et @error à 1 en cas d'erreur de paramètres.
; 0 et @error à 2 en cas de fonction appelé par
; _AAEInit() non existante.
; 0 et @error à 3 en cas de fonction appelé non
; existante.
; 0 et @error à 4 en cas d'erreur de récupération
; des retours de l'extension.
; 0 et @error à 5 si le fichier n'existe pas.
; 0 et @error à 6 si le paramètre $Parameters est mal
; formaté.
; 0 et @error à 7 si l'extension se ferme de façon
; innatendue.
; Notes : Si aucune fonction n'est appelé, alors seul la
; fonction appelé par _AAEInit() dans l'extension
; sera exécuté (si il y en a une).
Func _AAECall ( $File, $Function = False, $Parameters = False)
; Vérifis si le fichier existe...
If Not FileExists($File) Then Return SetError(5,0,0)
; Prépare la fonction...
If Not $Function Then $Function = "false"
; Prépare les paramètres...
Local $aArgs
If UBound($Parameters) Then
; Cherche une erreur d'array...
If $Parameters[0] <> "CallArgArray" Then Return SetError(6,0,0)
$aArgs = '"'&(UBound($Parameters)-1)&'"'
For $i = 1 To UBound($Parameters)-1 Step 1
$Param = StringReplace($Parameters[$i],"\","\\ ")
$Param = StringReplace($Param,'"','\a')
$aArgs &= ' "'&$Param&'"'
Next
EndIf
; Cherche si le fichier d'extension est un executable...
If StringRight($File,4) = ".exe" Then
; Supprime les fichiers de retour...
$FileName = __FileGetName ( $File)
FileDelete(@TempDir&"\"&$FileName&"_return.tmp")
FileDelete(@TempDir&"\"&$FileName&"_error.tmp")
; Lance le processus...
$PID = Run ( $File&" "&$aArgs&' "'&$Function&'"',@ScriptDir)
While ProcessExists($PID)
; Pause pour éviter la surcharge du processeur.
Sleep(100)
WEnd
; Récupère les retours...
$Return = FileRead(@TempDir&"\"&$FileName&"_return.tmp")
$Error = FileRead(@TempDir&"\"&$FileName&"_error.tmp")
; Cherche une erreur de récupération...
If $Return = "" Or $Error = "" Then Return SetError(4,0,0)
; Retourne les réponses...
Return SetError($Error,0,$Return)
; Si le fichier d'extension n'est pas un executable...
Else
; Cherche si le script qui appel l'extension est compilé...
If @Compiled And StringRight(@ScriptName,4) <> ".a3x" Then
; Supprime les fichiers de retour...
$FileName = __FileGetName ( $File)
FileDelete(@TempDir&"\"&$FileName&"_return.tmp")
FileDelete(@TempDir&"\"&$FileName&"_error.tmp")
; Lance le processus...
$PID = Run ( @ScriptFullPath&" /AutoIt3ExecuteScript """&$File&""" "&$aArgs&' "'&$Function&'"',@ScriptDir)
While ProcessExists($PID)
; Pause pour éviter la surcharge du processeur.
Sleep(100)
WEnd
; Récupère les retours...
$Return = FileRead(@TempDir&"\"&$FileName&"_return.tmp")
$Error = FileRead(@TempDir&"\"&$FileName&"_error.tmp")
; Cherche une erreur de récupération...
If $Return = "" Or $Error = "" Then Return SetError(4,0,0)
; Retourne les réponses...
Return SetError($Error,0,$Return)
; Si le script qui appel n'est pas compilé...
Else
; Supprime les fichiers de retour...
$FileName = __FileGetName ( $File)
FileDelete(@TempDir&"\"&$FileName&"_return.tmp")
FileDelete(@TempDir&"\"&$FileName&"_error.tmp")
; Lance le processus...
$PID = Run ( @AutoItExe&" """&$File&""" "&$aArgs&' "'&$Function&'"',@ScriptDir)
While ProcessExists($PID)
; Pause pour éviter la surcharge du processeur.
Sleep(100)
WEnd
; Récupère les retours...
$Return = FileRead(@TempDir&"\"&$FileName&"_return.tmp")
$Error = FileRead(@TempDir&"\"&$FileName&"_error.tmp")
; Cherche une erreur de récupération...
If $Return = "" Or $Error = "" Then Return SetError(4,0,0)
; Retourne les réponses...
Return SetError($Error,0,$Return)
EndIf
EndIf
EndFunc
; Fonction : _AAEExit ( [$Return, [$Error]])
; Quitte une extension AAE.
; Paramètres : $Return : Code de retour de la fonction _AAECall()
; $Error : Code d'erreur de la fonction _AAECall()
; Retour : Aucun.
Func _AAEExit ( $Return = 0, $Error = 0)
; Supprime l'appel de la fonction de fin de script...
OnAutoItExitUnRegister("__AAEExitNotRequired")
; Supprime les fichiers de retours...
FileDelete(@TempDir&"\"&@ScriptName&"_return.tmp")
FileDelete(@TempDir&"\"&@ScriptName&"_error.tmp")
; Ecrit les retours...
FileWrite(@TempDir&"\"&@ScriptName&"_return.tmp",$Return)
FileWrite(@TempDir&"\"&@ScriptName&"_error.tmp", $Error)
; Quitte le script...
Exit 0
EndFunc
#cs
*
* Fonctions à usage interne...
*
#ce
; Fonction : __FileGetName ( $File)
; Retourne un nom de fichier en fonction de son chemin d'accès.
; Paramètres : $File : Le chemin d'accès du fichier dont
; on souhite obtenir le nom.
; Retour : Le nom du fichier.
Func __FileGetName ( $File)
If Not StringInStr($File,"\") Then Return $File
$Split = StringSplit($File,"\")
Return $Split[$Split[0]]
EndFunc
; Fonction : __AAEExitNotRequired()
; Redirige vers la fonction _AAEExit() en cas de fin de script innatendue.
; Paramètres : Aucun.
; Retour : Aucun.
Func __AAEExitNotRequired()
_AAEExit( 0, 7)
EndFunc
Pour appeler une des fonctions présentes dans l'extension utilisez la fonction "_AAECall()".
Cet UDF fonctionne pour les scripts compilés où non et permet d'utiliser des extensions en AU3, A3X et EXE.
Voici un zip contenant un exemple d'utilisation et d'extensions :
- AAE.zip
- (286.93 Kio) Téléchargé 401 fois
