fichier auto-extractible

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Le psychopathe
Messages : 764
Inscription : jeu. 03/mars/2005 19:23

fichier auto-extractible

Message par Le psychopathe »

Bon je voudrais savoir comment on peut faire pour mettre des fichiers dans notre exe déjà compilé et après extraire les fichiers quand on en a besoin. Comme les programmes d'installations ou les patchers.
Toutes mes tentatives ont fais que l'exe ne demarre pas et petit message d'erreur exe éroné...
J'espère qu'on me comprend. :lol:
merci @+
:D
gansta93
Messages : 1448
Inscription : jeu. 26/févr./2004 11:17
Localisation : Le Village
Contact :

Message par gansta93 »

Voici un code qui poura sûrement t'aider, extrait de 2Dev maintenant appelé PureSources. Je ne 'ai pas testé mais s'il est là, c normalement qu'il marche. :-D
Il est en deux fichiers, chaque nom de fichier est mis en gras.

Créateur d'AEX.pb

Code : Tout sélectionner

;N'utilisez en aucun cas UPX ou un logiciel qui a la même fonction pour comprimer le fichier généré 
;Infos : 
;Vous devriez afficher le "Procédure Browser" à droite 
;Vous pourriez accéder facilement aux étapes importantes du programme 

;Auteur : Gillou 
;Version : PureBasic 3.92 
;Date : 13 février 2005 

;- 01 DEBUT 

Procedure ExpandBinaryfile(Fichier.s,binaire) ; EXTRAIRE LES FICHIERS INCLUS DANS LE PROGRAMME 
reussi=0 
If CreateFile(1, Fichier) 
UseFile(1) 
LON=?FNU-binaire 
If WriteData(binaire,LON) 
CloseFile(1) 
reussi=1 
EndIf 
EndIf 
ProcedureReturn reussi 
codeprog: 
IncludeBinary "install data.pb" 
FNU: 
EndProcedure 
Global pos 
Global ret 
Global position 
Global result.f 


Procedure PackerProgress(SourcePosition, DestinationPosition) ; ETAT DE LA COMPRESSION 
Shared FileLength 
Shared tempsab 
Shared fich$ 
If DestinationPosition>SourcePosition : Position=DestinationPosition : Else : Position=SourcePosition : EndIf 
Result.f = Position*100/FileLength 
res=Round(result,1) 
temps2=Round(ElapsedMilliseconds()/1000,0) 
If res-pos<>0 
min.s=Str(((100*(temps2-tempsab)/(res))-(temps2-tempsab))/60) 
sec.s=Str(((100*(temps2-tempsab)/(res))-(temps2-tempsab))-(Val(min)*60)) 
SetGadgetText(147,GetFilePart(fich$)+Chr(13)+Chr(13)+"Temps restant pour la compression : "+min+" min : "+sec+" s.") 
SetGadgetState(14, Round(Result,0)) 
pos=res 
EndIf 
If result<>0 And ret=0 
SetWindowTitle(1,"Compression en cours...") : ret=1 
EndIf 
While (WindowEvent()) : Wend 
ProcedureReturn 1 
EndProcedure 


Procedure.s purebasic() ; OU SE TROUVE PUREBASIC? 
path.s = "Applications\PureBasic.exe\shell\open\command" 
If RegOpenKeyEx_(#HKEY_CLASSES_ROOT, path, 0, #KEY_ALL_ACCESS, @Key) = #ERROR_SUCCESS 
indir.s = Space(500) 
insize = 500 
If RegQueryValueEx_(Key, "", 0, 0, @indir.s, @insize) = #ERROR_SUCCESS 
RegCloseKey_(Key) 
indir = RemoveString(indir, "%1", 1) 
indir = RemoveString(indir, Chr(34), 1) 
indir = RTrim(indir) 
path = GetPathPart(indir) 
Else 
MessageRequester("Erreur!", "Hum... Je ne trouve pas Purebasic", #MB_ICONERROR) 
RegCloseKey_(Key) 
path = "C:\program files\purebasic\" 
EndIf 
EndIf 
ProcedureReturn path.s 
EndProcedure 

ExeName.s = Space(255) : GetModuleFileName_(0, @ExeName, 255) 
OpenFile(21,GetPathPart(exename)+"configAEX.ini") 
adres1$=ReadString() 
adres2$=ReadString() 
CloseFile(21) 
fich$=OpenFileRequester("Ouvrez un fichier",adres1$,"Tous les fichiers|*.*",0,#PB_Requester_MultiSelection) 
If fich$ 
NewList fichier.s() 
Repeat 
AddElement(fichier()) : fichier()=fich$ 
fich$=NextSelectedFileName() 
Until fich$="" 
FirstElement(fichier()) : fich$=fichier() 
demand: 

;- 02 MAIS OU VA T-ON CREER CET EXECUTABLE? 

exe$=SaveFileRequester("Fichier à enregistrer type SFX",Left(fich$,Len(fich$)-Len(GetExtensionPart(fich$)))+"exe","EXE|*.exe",0) 
If exe$ 
If exe$=ExeName Or exe$=fich$ 
MessageRequester("Information","Vous ne pouvez pas choisir le même nom que votre programme",#MB_ICONWARNING) 
Goto demand 
EndIf 
file$=Left(exe$,Len(exe$)-Len(GetExtensionPart(exe$))-1) 
If UCase(GetExtensionPart(exe$))<>"EXE" 
exe$=exe$+".exe" 
EndIf 
ExpandBinaryfile(exe$+".pb",?codeprog) 
If CreateFile(18,GetPathPart(exe$)+"\RAZ.pb") : Else : End : EndIf 
CloseFile(18) 
If OpenFile(8,exe$+".pb") 
Repeat 
adres$=ReadString() 
If Left(adres$,10)="; UseIcon=" 
dos$=Mid(adres$,11,Len(adres$)) 
EndIf 
Until Eof(8) 
CloseFile(8) 

;- 03 AJOUT D UNE ICONE A L EXECUTABLE 

ico$=OpenFileRequester("Choisissez une icône (si vous annuler, le prog n'aura pas d'icône)",adres2$,"ICONE|*.ico",0) 
temps.l=ElapsedMilliseconds() 
If OpenWindow(0, 0, 0, 200, 30, #PB_Window_ScreenCentered , "Compilateur PureBasic") 
SetWindowPos_(WindowID(), #HWND_TOPMOST, 0, 0, 0, 0, #SWP_NOSIZE | #SWP_NOMOVE) 
If CreateGadgetList(WindowID()) 
TextGadget(1, 10, 10, 190, 20, "Compilation en cours...") 
EndIf 
EndIf 
Delay(1000) 

;- 04 CREATION DE L EXECUTABLE 

If ico$ 
result=RunProgram(purebasic()+"compilers\pbcompiler.exe",Chr(34)+exe$+".pb"+Chr(34)+" /EXE "+Chr(34)+exe$+Chr(34)+" /ICON "+Chr(34)+ico$+Chr(34)+" /XP /NT4 /QUIET","",1|2) 
Else 
result=RunProgram(purebasic()+"compilers\pbcompiler.exe",Chr(34)+exe$+".pb"+Chr(34)+" /EXE "+Chr(34)+exe$+Chr(34)+" /XP /NT4 /QUIET","",1|2) 
EndIf 
CreateFile(21,GetPathPart(exename)+"configAEX.ini") 
WriteStringN(GetPathPart(fich$)) 
WriteStringN(GetPathPart(ico$)) 
CloseFile(21) 

;- 05 VERIFICATION DE LA CREATION DE L EXECUTABLE 

If ReadFile(5,exe$) 
CloseFile(5) 
DeleteFile(exe$+".pb") 
DeleteFile(GetPathPart(exe$)+"RAZ.pb") 
Else 
If ReadFile(26,GetPathPart(exe$)+"RAZ.pb") And ReadFile(7,exe$+".pb") 
If result=0 
CloseFile(7) 
CloseFile(26) 
MessageRequester("Information","L'éxecutable n'a pas pu être généré!"+Chr(13)+Chr(13)+"Il y a une erreur dans le programme, merci de contacter le programmeur",#MB_ICONERROR) 
DeleteFile(exe$+".pb") 
DeleteFile(GetPathPart(exe$)+"RAZ.pb") 
End 
Else 
CloseFile(7) 
CloseFile(26) 
MessageRequester("Information","L'éxecutable n'a pas pu être généré!"+Chr(13)+Chr(13)+"Soit une erreur système s'est produite,"+Chr(13)+"soit la source du second programme contient une erreur, désolé",#MB_ICONERROR) 
DeleteFile(exe$+".pb") 
DeleteFile(GetPathPart(exe$)+"RAZ.pb") 
End 
EndIf 
Else 
CloseFile(7) 
CloseFile(26) 
Debug GetPathPart(exe$)+"RAZ.pb" 
MessageRequester("Information","L'éxecutable n'a pas pu être généré!"+Chr(13)+Chr(13)+"Les fichiers de configuration n'ont pas pu être généré, vérifier si le dossier n'est pas en lecture seul"+Chr(13)+Chr(13)+exe$+".pb"+Chr(13)+GetPathPart(exe$)+"RAZ.pb",#MB_ICONERROR) 
DeleteFile(exe$+".pb") 
DeleteFile(GetPathPart(exe$)+"RAZ.pb") 
End 
EndIf 
EndIf 
EndIf 
CloseWindow(0) 

;- 06 COMPRESSER LE FICHIER 

If ReadFile(50, fich$) 
FileLength = Lof() 
CloseFile(50) 
EndIf 
pack$=Left(fich$,Len(fich$)-1-Len(GetExtensionPart(fich$)))+".JCG1" 
If OpenWindow(1, 0, 0, 300, 100,#PB_Window_ScreenCentered, "Mise en mémoire...") 
SetWindowPos_(WindowID(), #HWND_TOPMOST, 0, 0, 0, 0, #SWP_NOSIZE | #SWP_NOMOVE) 
CreateGadgetList(WindowID()) 
ProgressBarGadget(14, 10, 10, 280, 20, 0, 100,#PB_ProgressBar_Smooth) 
CreatePack(pack$) 
tempsab=Round(ElapsedMilliseconds()/1000,0) 
TextGadget(147,10,40,280,40,"Calcul en cours...") 
PackerCallback(@PackerProgress()) 
For a=1 To CountList(fichier()) 
SelectElement(fichier(),a-1) 
fich$=fichier() 
FileLength=FileSize(fich$) 
resulta=AddPackFile(fich$,9) ; compression max 
Next 
FirstElement(fichier()) 
fich$=fichier() 
If resulta=1 
ClosePack() 
CloseWindow(1) 
Else 
MessageRequester("Information","La compression a échouée") 
EndIf 
EndIf 

;- 07 FENETRE 

taille.f=FileSize(pack$) 
OpenWindow(2,0,0,150,40,#PB_Window_ScreenCentered,"Création en cours") 
SetWindowPos_(WindowID(), #HWND_TOPMOST, 0, 0, 0, 0, #SWP_NOSIZE | #SWP_NOMOVE) 
CreateGadgetList(WindowID(2)) 
ProgressBarGadget(4,10,10,130,15,0,100,#PB_ProgressBar_Smooth) 
RenameFile(exe$,file$) 
If OpenFile(1,pack$) 
If OpenFile(0,file$) 
UseFile(0) 
Repeat 
ReadString() 
Until Eof(0) 
WriteStringN("") 

;- 08 ECRITURE DES INFORMATIONS POUR LA DECOMPRESSION 

WriteStringN("LGGILLOUFile"+Str(CountList(fichier()))) 
fichs$="¤" 
For a=1 To CountList(fichier()) 
SelectElement(fichier(),a-1) 
fichs$=fichs$+GetFilePart(fichier())+"¤"+Str(FileSize(fichier()))+"¤" 
Next 
WriteStringN(fichs$) 
UseFile(1) 
FirstElement(fichier()) 
fich$=fichier() 

;- 09 INCLURE LE FICHIER VOULU DANS L EXECUTABLE 

Data1.s=Space(500) 
Repeat 
UseFile(1) 
lon=ReadData(@Data1,500) 
UseFile(0) 
WriteData(Data1.s,lon) 
n=n+lon 
SetGadgetState(4,Round(n*100/taille,0)) 
Until Eof(1) 
CloseFile(1) 
CloseFile(0) 
RenameFile(file$,exe$) 
DeleteFile(pack$) 
tempsa=ElapsedMilliseconds() 
resultat.f=(tempsa-temps)/1000 
FreeGadget(4) 
UseWindow(2) 
ResizeWindow(170,90) 

;- 10 RESULTAT 

SetWindowTitle(2,"Opération réussi") 
min.s=Str(Round(resultat/60,0)) 
sec.s=Str(Round(resultat-(Val(min)*60),0)) 
ms.s=Str(1000*(resultat-Round(resultat,0))) 
TextGadget(145,10,10,150,40,"temps de calcul : "+Chr(13)+Chr(13)+min+" min : "+sec+","+ms+" s.") 
ButtonGadget(146,10,60,150,20,"OK") 
Repeat 
Select WaitWindowEvent() 
Case #PB_EventGadget 
Select EventGadgetID() 
Case 146 
quit=1 
EndSelect 
EndSelect 
Until quit=1 
CloseWindow(1) 
EndIf 
EndIf 
EndIf 
EndIf 
Install data.pb

Code : Tout sélectionner

Procedure decompress() ; DECOMPRESSER LES FICHIERS DE L'ARCHIVE 
Shared FileLength 
Shared Fich$ 
Shared sa 
Shared nfich 
Shared a 
If sa 
info=NextPackFile() 
If info 
If FileLength<>PackFileSize() 
MessageRequester("Information","Une erreur s'est produite lors de la décompression.",#MB_ICONEXCLAMATION) 
End 
EndIf 
ResizeWindow(400,40) 
ResizeGadget(110,10,10,380,20) 
SetWindowTitle(0,"Ecriture du fichier : "+GetFilePart(Fich$)) 
CreateFile(123,Fich$) 
WriteData(info,FileLength) 
CloseFile(123) 
SetGadgetState(110, a*100/nfich) 
Else 
ProcedureReturn 0 
EndIf 
Else 
MessageRequester("Information","Impossible d'ouvrir l'archive",#MB_ICONERROR) 
ProcedureReturn 0 
EndIf 
ProcedureReturn 1 
EndProcedure 

;- 01 RECHERCHE DE L ARCHIVE DANS L EXECUTABLE 

tempsab=ElapsedMilliseconds() 
ExeName.s = Space(255) : GetModuleFileName_(0, @ExeName, 255) 
If ReadFile(1,ExeName) 
For a=1 To 2 
Repeat 
m$=ReadString() 
Until Left(m$,12)="LGGILLOUFile" Or Eof(1) 
Next 
If Left(m$,12)<>"LGGILLOUFile" 
End 
EndIf 

;- 02 RECHERCHE DES INFORMATIONS SUR LES FICHIERS QUE CONTIENT L ARCHIVE 

nfich=Val(Mid(m$,13,100)) 
fichs$=ReadString() 
Structure info 
nom.s 
taille.l 
EndStructure 
NewList fichier.info() 
For a=2 To nfich*2+1 
AddElement(fichier()) 
fichier()\nom=StringField(fichs$,a,"¤") 
a=a+1 
fichier()\taille=Val(StringField(fichs$,a,"¤")) 
Next 

;- 03 CREATION DU FICHIER OU VA ETRE EXTRAIT L ARCHIVE 

path$=PathRequester("Choisissez le dossier de décompression des ou du fichier que contient cette archive",GetPathPart(ExeName)) 
If path$="" 
path$=GetPathPart(ExeName) 
EndIf 
If ReadFile(2,path$+"Archive.JCG1") 
Repeat 
CloseFile(2) 
rn=rn+1 
Until ReadFile(2,path$+"Archive ("+Str(rn)+").JCG1")=0 
pack$=path$+"Archive ("+Str(rn)+").JCG1" 
Else 
If MessageRequester("AEX - Infos","Voulez-vous extraire le ou les fichiers dans le repertoire courant?"+Chr(13)+"("+path$+")", #PB_MessageRequester_YesNo)=6 
pack$=path$+"Archive.JCG1" 
Else 
End 
EndIf 
EndIf 
If CreateFile(2,pack$)=0 
MessageRequester("Erreur","Impossible de créer l'archive",#MB_ICONERROR) 
End 
EndIf 

;- 04 EXTRACTION DE L ARCHIVE 

OpenWindow(1,0,0,150,40,#PB_Window_ScreenCentered,"Extraction...") 
SetWindowPos_(WindowID(), #HWND_TOPMOST, 0, 0, 0, 0, #SWP_NOSIZE | #SWP_NOMOVE) 
CreateGadgetList(WindowID(1)) 
ProgressBarGadget(4,10,10,130,15,0,100,#PB_ProgressBar_Smooth) 
UseFile(1) 
Data1.s=Space(500) 
Repeat 
lon=ReadData(@Data1,500) 
UseFile(2) 
n=n+lon 
WriteData(Data1,lon) 
UseFile(1) 
SetGadgetState(4,Round(lon*100/taille,0)) 
Until Eof(1) 
CloseFile(2) 
CloseFile(1) 
CloseWindow(1) 

;- 05 DECOMPRESSION DES FICHIERS DE L ARCHIVE 

If OpenWindow(0, 0, 0, 200, 40, #PB_Window_ScreenCentered, "Décompression en cours...") 
SetWindowPos_(WindowID(), #HWND_TOPMOST, 0, 0, 0, 0, #SWP_NOSIZE | #SWP_NOMOVE) 
CreateGadgetList(WindowID()) 
ProgressBarGadget(110, 10, 10, 180, 20, 0, 100,#PB_ProgressBar_Smooth) 
sa=OpenPack(pack$) 
For a=1 To nfich 
SelectElement(fichier(),a-1) 
FileLength=fichier()\taille 
Fich$=path$+fichier()\nom 
decompress() 
Next 
ClosePack() 
CloseWindow(0) 
EndIf 
DeleteFile(pack$) 
EndIf 
DataSection 
Fichier: 
IncludeBinary "RAZ.pb" 
EndDataSection
En espèrant que cela t'aidera.
Avatar de l’utilisateur
Le psychopathe
Messages : 764
Inscription : jeu. 03/mars/2005 19:23

Message par Le psychopathe »

Merci en ayant survolé je pense que c'est sa, il y a juste l'histoire du compilateur de pure basic que j'aime pas car je veux que mes fichiers se fasse à n'importe quel endroit. Enfin je vais étudier ce code merci.
@++
NY152
Messages : 148
Inscription : dim. 14/mai/2006 20:41

Re: fichier auto-extractible

Message par NY152 »

Ce code m'aurais intéressé pour un programme mais j'utilise la version 4.51 de Pure Basic et y a des erreurs de partout :(

C'est fatiguant de devoir à chaque fois ré-écrire ses programme de versions en versions ...

Si quelqu'un pourrait m'aider car là je suis largué !
.:NY152:.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: fichier auto-extractible

Message par nico »

http://www.purebasic.fr/french/viewtopi ... =1&t=11961

Cela m'a toujours intéressé de comprendre comment fonctionnait les installateurs, et comment il arrivait à intégrer de datas dans un exe.
C'est pour cela que je me suis intéressé au format PE et l'ajout de section mais en réalité, il n'y a pas plus simple à faire; il suffit juste de rajouter les données à la fin du fichier de l'exe.

Ces données ne seront pas mappées en mémoire donc à partir de l'exe, il faut lire le fichier de l'exe lui même pour accéder aux données.
Répondre