[Tuto] Ajout et utilisation de ressources dans votre EXE.
Posté : sam. 09 févr. 2008 15:32
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 :
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 :
Exemple complexe de l'utilisation de l'UDF :
Code de l'UDF Resources.au3 :
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) :
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.
.
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 :* N'oubliez pas que pour ajouter des icônes il vous suffit d'utiliser la directive #AutoIt3Wrapper_Res_Icon_Add.Code : Tout sélectionner
#AutoIt3Wrapper_Res_File_Add=C:\WINDOWS\Media\tada.wav, SOUND, MYWAV
Exemple :Code : Tout sélectionner
#AutoIt3Wrapper_Res_Icon_Add=C:\Program Files\AutoIt3\Icons\au3.ico
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
► Afficher le texte
► Afficher le texte
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
Il va de soit que vous devez adapter la ligne à la circonstance.
.