Page 1 sur 1
Executable auto extractible
Publié : dim. 19/févr./2006 18:59
par mangatome
Bonjour a tous.
Je cherche le moyen d'ajouter un fichier dans un exécutable pour en faire un auto extractible.
Je m'explique.
Mettons que je compile un executable qui se charge d'extraire de lui même un fichier "gnagna.txt" mais qui n'est pas présent. Je voudrais enfait pouvoir ajouter ce fichier après la compilation de l'executable. Et l'executable se chargerait ensuite d'extraire ce fichier.
C'est utopique ou pas?
Merci de vos réponses.
Publié : dim. 19/févr./2006 19:20
par nico
C'est possible avec un compilateur de ressource, Ressource Hack par exemple.
Publié : dim. 19/févr./2006 19:25
par CameleonTH
J'ai fait un petit truc mais je ne sais pas si c'est ce que tu cherche.
Code : Tout sélectionner
OpenFile(0,"test2.txt")
WriteData(?file1,MemoryStringLength(?file1))
CloseFile(0)
DataSection
file1:
IncludeBinary("test.txt")
EndDataSection
Publié : dim. 19/févr./2006 20:31
par mangatome
@CameleonTH : oui, ça c'est pour une inclusion de data statique, merci, mais ce que je cherche a faire c'est inclure la data dans l'executable déja compilé.
@nico : effectivement, mais je souhaite faire ça automatiquement. c'est pour un projet d'installeur en fait.
Publié : dim. 19/févr./2006 20:32
par Dr. Dri
updateresource_ (un truc dans le genre)
Dri
Publié : lun. 20/févr./2006 0:25
par Dorian
Si tu veux j'avais fais un truc du style mais c'est un peu plus compliqué ^^
Publié : lun. 20/févr./2006 1:26
par Dorian
Bon voilà j'ai fais un truc vite fais :
Exe.exe (la base de l'autoextractible) :
; #New_Ligne = Chr(13) + Chr(10) ; Saut de ligne
Procedure.s GetExeName()
ExeName.s = Space (255)
GetModuleFileName_ (0, @ExeName, 255)
ProcedureReturn ExeName
EndProcedure
If MessageRequester ( "Fichier auto - extractible" , "Voulez-vous dézipper le fichier ?" , #PB_MessageRequester_YesNo ) = 7
; pressed No button
End
EndIf
Path.s = PathRequester ( "Chemin :" , "C:\" )
Exe.s = GetExeName()
; Lecture des Datas
ReadFile (0, Exe)
Position.l = 9728 ; Taille de cet éxécutable après compilation
FileSeek (Position)
*Nom = AllocateMemory (256) ; Memoire pour la réception du nom de fichier
ReadData (*Nom, 256)
Nom.s = Trim ( PeekS (*Nom))
Position = Position + 256
*Buffer = AllocateMemory ( FileSize (Exe) - Position) ; Memoire pour réceptionner
; les datas
ReadData (*Buffer, FileSize (Exe) - Position)
CloseFile (0)
; Ecriture des Datas
CreateFile (0, Path + Nom)
WriteData (*Buffer, FileSize (Exe) - Position)
CloseFile (0)
MessageRequester ( "Info" , "Le fichier " + Nom + " a été décompréssé" )
Add.exe (le createur de d'auto...) :
File.s = OpenFileRequester ( "Ouvrir ..." , "" , "Tout (*.*)|*.*" , 0)
Exe.s = SaveFileRequester ( "Sauver l'éxecutable ...," , "" , "Executable|*.exe" , 0)
OpenFile (0, File)
*Buffer = AllocateMemory ( FileSize (File))
ReadData (*Buffer, FileSize (File))
CloseFile (0)
CreateFile (0, Exe + ".exe" )
WriteData (?MyExec, ?MyEndExec - ?MyExec)
Position.l = 9728 ; Même taille que dans la source précédente
FileSeek (Position)
*Nom = AllocateMemory (256)
PokeS (*Nom, GetFilePart (File))
WriteData (*Nom, 256)
WriteData (*Buffer, FileSize (File))
CloseFile (0)
DataSection
MyExec:
IncludeBinary "exe.exe" ; Executable
MyEndExec:
EndDataSection
Attention : Pour compiler Add.exe il faut d'abord avoir compiler exe.exe (exe.exe peut être supprimé après la compilation de add.exe)
Attention 2 : Toute modification du code de exe.exe ou modification de sont icônes ... risque de modifier sa taille, il faudra alors mettre à jour la variable position dans les 2 sources et recompiler.
Mon exemple est simpliste et sûrement améliorable (là on ne peut mettre qu'un fichier à la fois) mais j'espère qu'il te conviens ^^[/code]
Publié : lun. 20/févr./2006 1:39
par nico
@nico : effectivement, mais je souhaite faire ça automatiquement. c'est pour un projet d'installeur en fait.
Comme la souligné Dr.Dri, il faut utiliser les API pour modifier les ressources d'un exe ou Dll, cela ne semble pas très compliqué à faire d'après la doc MSDN, il donne un exemple.
Publié : lun. 20/févr./2006 1:48
par Dorian
nico a écrit :Comme la souligné Dr.Dri, il faut utiliser les API pour modifier les ressources d'un exe ou Dll, cela ne semble pas très compliqué à faire d'après la doc MSDN, il donne un exemple.
Ou en modifiant mon code ^^ si il veut pas passer par les API

Publié : lun. 20/févr./2006 14:07
par frederic
il te faut deux exe, un qui contiendra ton fichier ajouté (on l'appellera exe2) et un qui sera chargé de modifier le premier pour ajouter le fichier (exe1).
exe1 ouvre le fichier à ajouter, recupere sa taille puis ouvre exe2 lui rajoute une section et copie tout le fichier à ajouter dans cette section. Comme la section est en fin d'exe, tu n'as pas de problème de taille. Dans ton exe2 tu fera toujours reference à l'offset de fin de ton exe2 non modifié comme début de ton fichier ajouté ou bien tu t'arranges pour stocker l'offset autre part.
Pour plus d'info cherche dans google "ajouter une section à un exe au format PE"
Publié : lun. 20/févr./2006 18:12
par mangatome
Et bien merci a tous pour ces infos et ce code.
Néanmoins je ne comprends pas un truc.
Code : Tout sélectionner
Position.l = 9728 ; Taille de cet éxécutable après compilation
Comment je dois faire pour récupérer cette taille vu que le fichier ajouté à l'exe a une taille variable?
Publié : lun. 20/févr./2006 20:01
par Dorian
mangatome a écrit :Et bien merci a tous pour ces infos et ce code.
Néanmoins je ne comprends pas un truc.
Code : Tout sélectionner
Position.l = 9728 ; Taille de cet éxécutable après compilation
Comment je dois faire pour récupérer cette taille vu que le fichier ajouté à l'exe a une taille variable?
C'est la taille du fichier EXE sans rien telle qu'il est compilé par pure. Elle change pas tant que tu change pas au code source
Enfaite, je le fait en 2 étapes :
1) je met n'importe quoi comme valeur. Ensuite tu créer l'exe
2) Tu regarde le poids que fais ton exe compilé. Tu remplace 9728 par le poids (en octets) de ton exe précédement compilé. Et enfin tu recompile.
Ya d'autre méthodes pour la variable Posistion mais c'est beaucoup moins propre. Cette variable est à modifier si tu change le code source ou l'icône.
J'espere que tu me comprend ^^
Publié : mar. 21/févr./2006 11:07
par mangatome
No problem, j'en ai vu d'autres.
Merci pour ces précisions, c'est bien ce que je pensais mais comme je compile sur PB 3.94, forcément ma taille est différente de la tienne sur le même source.
Ok, grand merci a tous !