[Tuto] Ajout et utilisation de ressources dans votre EXE.

Espace contenant des tutoriels divers concernant AutoIt.
Règles du forum
.

Tutoriel "La programmation avec Autoit" : https://openclassrooms.com/fr/courses/1 ... vec-autoit
Répondre
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

[Tuto] Ajout et utilisation de ressources dans votre EXE.

#1

Message par Tlem »

Edit du 04/08/2014 : Les informations ci-dessous sont toujours valables pour les anciennes versions d'AutoIt, mais pour fonctionner avec la version 3.3.12.0 de AutoIt, guinness (Membre du forum Anglais) à mis à jour avec l'aide d'autres membres l'UDF Resources renommé pour l'occasion en ResourcesEx. Toutes les fonctions ont été renommées, d'autres ont été rajoutées et le code optimisé, donc veuillez vous référer au sujet d'origine pour bénéficier de cette nouvelle version.


Les informations décrites ci-dessous proviennent du forum Anglais, et vous pourrez trouver les dernières mise à jour,
ou informations sur le lien suivant : http://www.autoitscript.com/forum/index ... opic=51103

Il à déjà été décrit dans le forum, comment inclure des ressources dans une DLL,
et comment les utilisées (http://www.autoitscript.fr/forum/viewto ... f=11&t=310).

Il est aussi possible d'inclure des ressources avec la fonction Fileinstall().
Mais cette méthode implique la 'décompression' de la ressource dans un dossier temporaire.

Zedna (Membre du forum Anglais) à donc réaliser un UDF, qui permet d'utiliser les ressources ajoutées à votre exécutable
grâce certaines directives de Scite4AutoIt3.
Le type de directive dépend de la version de Scite4AutoIt que vous utilisez :
  • Scite4AutoIt antérieure au 06/02/2010 :
    Vous devez avoir installé Reshacker (Voir ici) et utiliser la directive #AutoIt3Wrapper_run_after.
    Exemple :

    Code : Tout sélectionner

    #AutoIt3Wrapper_run_after=ResHacker.exe -add %out%, %out%, test_1.txt, rcdata, TEST_TXT_1, 0
  • Scite4AutoIt à partir du 06/02/2010, alors vous pouvez utiliser la directive #AutoIt3Wrapper_Res_File_Add.
    Exemple :

    Code : Tout sélectionner

    #AutoIt3Wrapper_Res_File_Add=C:\WINDOWS\Media\tada.wav, SOUND, MYWAV
    * N'oubliez pas que pour ajouter des icônes il vous suffit d'utiliser la directive #AutoIt3Wrapper_Res_Icon_Add.
    Exemple :

    Code : Tout sélectionner

    #AutoIt3Wrapper_Res_Icon_Add=C:\Program Files\AutoIt3\Icons\au3.ico
Si vous avez besoin de plus de détails sur le nommage des ressources, merci de vous rendre sur ce sujet : [Tuto] Création d'une dll de ressources pour votre script

Liste des fonctions disponibles :
_ResourceGet($ResName, $ResType = $RT_RCDATA, $ResLang = 0, $DLL = -1)
_ResourceGetAsString($ResName, $ResType = $RT_RCDATA, $ResLang = 0, $DLL = -1)
_ResourceGetAsStringW($ResName, $ResType = $RT_RCDATA, $ResLang = 0, $DLL = -1)
_ResourceGetAsBytes($ResName, $ResType = $RT_RCDATA, $ResLang = 0, $DLL = -1)
_ResourceGetAsImage($ResName, $ResType = $RT_RCDATA, $DLL = -1)
_ResourceGetAsBitmap($ResName, $ResType = $RT_RCDATA, $DLL = -1)
_ResourceSaveToFile($FileName, $ResName, $ResType = $RT_RCDATA, $ResLang = 0, $CreatePath = 0, $DLL = -1)
_ResourceSetImageToCtrl($CtrlId, $ResName, $ResType = $RT_RCDATA, $DLL = -1)
_SetBitmapToCtrl($CtrlId, $hBitmap)
_ResourcePlaySound($ResName, $Flag = 0, $DLL = -1)


Notes :
* Pour compiler tous les scripts d'exemple vous devez avoir installé Scite4AutoIt3 ainsi que reshacker.exe/upx.exe dans le "path de recherche Windows" ou dans le répertoire du script -> vous devez compiler le script avec F7 depuis Scite4AutoIt.
* Pour compiler tous les scripts d'exemple les ressources doivent ce trouvées dans le répertoire du script (depuis le fichier resource_data.zip)
* _ResourceGet() retourne toujours le pointeur de donnée (pour RT_BITMAP retourne hBitmap), le retour d'autres types peut être obtenu par des fonctions 'wrapper' additionnelles telle que _ResourceGetAsString() ou _ResourceGetAsBytes()
* _ResourceGetAsStringW() est pour les chaines Unicode (Widechar)
* Vous pouvez aussi utiliser les nombre au lieu du nom de la ressource (voir les exemples).
* Les types de ressource générale supportés, sont listés dans l'UDF et dans les constantes. ($RT_BITMAP, $RT_RCDATA, ...)
* Vous trouverez plus d'informations sur la lecture de fichiers video à partir des ressources ici (merci matrixnz)
* Vous trouverez plus d'informations/exemples sur l'utilisation de GIFs animés à partir des ressources ici et ici merci à smashly et ProgAndy.
* Vous trouverez plus d'informations sur le lancement de fichiers EXE ou de l'utilisation des fonctions d'une DLL directement à partir des ressources ici (merci trancexx/Ward)

Problèmes/limitations connus :
* _ResourceGet() retourne la taille de la ressource (en bytes) dans la macro @extended mais pas pour les ressources de type RT_BITMAP.
* _ResourceSetImageToCtrl() works with "static/button" type of controls (picture,label,icon,button,checkbox,radiobutton,groupbox)
* _ResourceSetImageToCtrl() fonctionne avec des contrôles statiques et boutons (image, label, icône, bouton, boite à cocher, bouton radio, groupe de boite).
* _ResourcePlaySound() ne joue que les fichiers WAV (pas les fichiers MP3).
* _ResourceGetAsBytes() ne fonctionne pas pour les types RT_BITMAP
par ce que _ResourceGet() retourne hBitmap au lieu du pointeur mémoire dans ce cas
utilisez plutôt _ResourceGetAsImage().
* _ResourceGet() à une fuite de mémoire à la libération des ressources UnlockResource, FreeResource (à l'opposé de LoadResource, LockResource) n'est pas fait parce qu'il doit être fait après l'utilisation des ressources à la fin et non à l'intérieur de l'UDF.
* _GDIPlus_Startup() est appelé au début de chaque include --> Aucun _GDIPlus_Shutdown() ne l'est.

Exemple simple de l'utilisation de l'UDF :
► Afficher le texteresource_test_min1.au3
Exemple complexe de l'utilisation de l'UDF :
► Afficher le texte
Code de l'UDF Resources.au3 :
► Afficher le texte
Vous devez bien évidement inclure ce fichier dans votre script, pour pouvoir utiliser les fonctions décrites plus haut.
Voici un exemple d'utilisation, vérifiez d'avoir dans le mème répertoire que le script, les ressources suivantes :
test_1.txt, image1.bmp, image2.bmp, image3.jpg, test_1.gif, test_1.htm, binary_data1.dat, binary_data2.bmp (Voir fichier resource_data.zip joint).

Exemple pour l'ancienne version de Scite4AutoIt (<06/02/2010) :
► Afficher le texte
Si vous utilisez une version de Scite4AutoIt >= 06/02/2010 alors, remplacez l'utilisation de la directive #AutoIt3Wrapper_run_after par la directive #AutoIt3Wrapper_Res_File_Add.
Il va de soit que vous devez adapter la ligne à la circonstance. ;)

.
Fichiers joints
resource_au3.zip
(6.84 Kio) Téléchargé 1241 fois
ResHacker.zip
(317.64 Kio) Téléchargé 1093 fois
resource_data.zip
(18.32 Kio) Téléchargé 1062 fois
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [Tuto] Ajout et utilisation de ressources dans votre EXE.

#2

Message par Tlem »

Mise à jour du code du fichier resources.au3.
Archive zip mise à jour.

Info : Correction sur la fonction _ResourceGet pour l'utilisation d'une ressource TXT à partir d'une DLL (voir ce sujet pour plus d'informations).
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [Tuto] Ajout et utilisation de ressources dans votre EXE

#3

Message par Tlem »

Mise à jour du premier message avec le lien vers le nouvel UDF ResourcesEx mis à jour récemment.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Répondre