Executable auto extractible
Executable auto extractible
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.
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.
http://www.cybisoft.net - mes jeux, mods, tools en PB et autres languages 

-
- Messages : 333
- Inscription : sam. 25/juin/2005 11:18
- Localisation : Laon (02)
- Contact :
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
@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.
@nico : effectivement, mais je souhaite faire ça automatiquement. c'est pour un projet d'installeur en fait.
http://www.cybisoft.net - mes jeux, mods, tools en PB et autres languages 

Bon voilà j'ai fais un truc vite fais :
Exe.exe (la base de l'autoextractible) :
Add.exe (le createur de d'auto...) :
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]
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]
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"
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"
Et bien merci a tous pour ces infos et ce code.
Néanmoins je ne comprends pas un truc.
Comment je dois faire pour récupérer cette taille vu que le fichier ajouté à l'exe a une taille variable?
Néanmoins je ne comprends pas un truc.
Code : Tout sélectionner
Position.l = 9728 ; Taille de cet éxécutable après compilation
http://www.cybisoft.net - mes jeux, mods, tools en PB et autres languages 

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 sourcemangatome a écrit :Et bien merci a tous pour ces infos et ce code.
Néanmoins je ne comprends pas un truc.Comment je dois faire pour récupérer cette taille vu que le fichier ajouté à l'exe a une taille variable?Code : Tout sélectionner
Position.l = 9728 ; Taille de cet éxécutable après compilation
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 ^^
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 !
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 !
http://www.cybisoft.net - mes jeux, mods, tools en PB et autres languages 
