Executable auto extractible

Programmation d'applications complexes
mangatome
Messages : 80
Inscription : mer. 29/déc./2004 13:19
Contact :

Executable auto extractible

Message 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.
http://www.cybisoft.net - mes jeux, mods, tools en PB et autres languages :)
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

C'est possible avec un compilateur de ressource, Ressource Hack par exemple.
CameleonTH
Messages : 333
Inscription : sam. 25/juin/2005 11:18
Localisation : Laon (02)
Contact :

Message par CameleonTH »

J'ai fait un petit truc mais je ne sais pas si c'est ce que tu cherche. :D

Code : Tout sélectionner

OpenFile(0,"test2.txt")
WriteData(?file1,MemoryStringLength(?file1))
CloseFile(0)


DataSection
file1:
IncludeBinary("test.txt")
EndDataSection
mangatome
Messages : 80
Inscription : mer. 29/déc./2004 13:19
Contact :

Message 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.
http://www.cybisoft.net - mes jeux, mods, tools en PB et autres languages :)
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

updateresource_ (un truc dans le genre)

Dri
Dorian
Messages : 489
Inscription : mar. 15/mars/2005 15:33

Message par Dorian »

Si tu veux j'avais fais un truc du style mais c'est un peu plus compliqué ^^
Dorian
Messages : 489
Inscription : mar. 15/mars/2005 15:33

Message 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]
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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.
Dorian
Messages : 489
Inscription : mar. 15/mars/2005 15:33

Message 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

:0: :jesors: #pendu
frederic
Messages : 22
Inscription : dim. 07/août/2005 9:40

Message 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"
mangatome
Messages : 80
Inscription : mer. 29/déc./2004 13:19
Contact :

Message 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?
http://www.cybisoft.net - mes jeux, mods, tools en PB et autres languages :)
Dorian
Messages : 489
Inscription : mar. 15/mars/2005 15:33

Message 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 ^^
mangatome
Messages : 80
Inscription : mer. 29/déc./2004 13:19
Contact :

Message 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 !
http://www.cybisoft.net - mes jeux, mods, tools en PB et autres languages :)
Répondre