Enregistrer des paramètres directement dans l'exécutable
Publié : jeu. 08/avr./2004 14:23
Salut,
certain dise que c'est impossible, voir ce sujet :
http://www.purebasic.fr/french/viewtopic.php?t=267
d'ailleurs Fred avait dis ceci :
donc le code qui permet d'enregistrer des paramètres dans l'exécutables.
pour tester ce code, il faut créer un exécutables. car à chaque fois qu'on compile le prog, on efface les paramètres enregistrés donc si on ne créé pas un exe, on ne verra rien du tout.
Mise à jour du code pour PB 4.20
j'ai essayé de bien commenté mon super code mais si un point n'est pas clair, n'hésitez pas à me poser la question.
Et n'oubliez pas que je suis un génie (d'après Fred) donc dorénavant, vous vous agenouillerez devant moi quand je posterais sur le forum
(j'en profite largement, hein ? mais ne vous inquiétez pas pour mon ego, il est indestructible)
certain dise que c'est impossible, voir ce sujet :
http://www.purebasic.fr/french/viewtopic.php?t=267
d'ailleurs Fred avait dis ceci :
Je prends au mot ce qu'a dis Fred donc je suis un as de la programmationSi c'est pour écrire du code automodifiable, c'est oui aussi, mais faut avoir un sacré niveau en assembleur
a mon avis ca parait carrement difficile (mais pas impossible). Surtout que l'exe peut etre stockée dans une zone disque en lecture seule. Mon conseil: utilise un .ini dans le rep de l'utilisateur.

donc le code qui permet d'enregistrer des paramètres dans l'exécutables.
pour tester ce code, il faut créer un exécutables. car à chaque fois qu'on compile le prog, on efface les paramètres enregistrés donc si on ne créé pas un exe, on ne verra rien du tout.
Mise à jour du code pour PB 4.20
Code : Tout sélectionner
; Auteur : Le Soldat Inconnu
; Version de PB : 4.20
;
; Explication du programme :
; Cet exemple montre comment enregistrer des paramètres directement dans un exécutables
; Conseil : faire un exécutable pour tester ce code
#ParamLenght = 100 ; longueur en octects du nombre de donnée à sauvegarder dans l'exécutable
Procedure.l Recherche_Emplacement_Parametre()
Protected Texte.s, Texte2.s, Mem.l, Caractere.s, Pos.l
Pos = 0
; initialisation de la recherche de la zone qui contient les paramètres du programme
Texte.s = "Texte de détection "
Texte2.s = "de la DataSection"
Texte = Texte + Texte2 ; j'ai coupé le texte en 2 car si je l'écrit d'un seul bloc, la recherche va confondre ce texte avec celui de la DataSection
Mem = AllocateMemory(36)
Caractere.s = " "
; Recherche de la zone qui contient les paramètres
Repeat
ReadData(0, @Caractere, 1)
If Caractere = "T" ; si le caractère lu est un "T", on teste d'abord sur la première lettre du texte pour une question de rapidité
FileSeek(0, Loc(0) - 1) ; on remonte dans le fichier pour tester sur le texte complet
ReadData(0, Mem, 36) ; on lit le texte du fichier
If CompareMemory(@Texte, Mem, 36) ; on compare le Texte avec ce qu'on lit dans le fichier
Pos = Loc(0)
EndIf
FileSeek(0, Loc(0) - 35) ; on revient à la position initial du fichier, avant le test sur le texte complet pour continuer
EndIf
Until Eof(0) Or Pos
; MessageRequester("", "Recherche position = " + Str(Pos), 0)
ProcedureReturn Pos
EndProcedure
Procedure.s Lecture_Parametre()
Protected Position.l, Parametre.s
If ReadFile(0, ProgramFilename()) ; on ouvre le fichier
Position = Recherche_Emplacement_Parametre()
FileSeek(0, Position)
Parametre = Space(#ParamLenght)
ReadData(0, @Parametre, #ParamLenght)
CloseFile(0)
Else
MessageRequester("Erreur", "Impossible de lire les paramètres du programme", 0)
End
EndIf
ProcedureReturn Parametre
EndProcedure
Procedure Ecriture_Parametre(Txt.s)
; On ne peut écrire que du texte
CopyFile(ProgramFilename(), GetPathPart(ProgramFilename()) + "temp.exe") ; on copie l'exécutable
; MessageRequester("", "'" + Txt + "'", 0)
RunProgram(GetPathPart(ProgramFilename()) + "temp.exe", "#Ecriture " + Chr(34) + ProgramFilename() + Chr(34) + " " + Chr(34) + Txt + Chr(34), GetPathPart(ProgramFilename())) ; on lance la copie de l'exe avec en paramètre le nom de l'exe et ce l'on souhaite écrire deans
End ; on quitte le programme obligatoirement pour pouvoir enregistrer les parametres
EndProcedure
Procedure Enregistre_Parametre()
Protected Position.l, Param.s, Txt.s, Programme.s, Parametres.s
Programme.s = ProgramParameter()
Txt.s = ProgramParameter()
Txt = Left(LSet(Txt, #ParamLenght, " "), #ParamLenght) ; on ajuste le texte pour qu'il fasse une longueur de #ParamLenght
Repeat
Delay(100)
; On renomme le fichier jusqu'a ce que l'opération soit effectuée (permet d'attendre la fin de l'execution du programme)
Until RenameFile(Programme, Programme + ".bak")
If OpenFile(0, Programme + ".bak") ; on ouvre le fichier
Position = Recherche_Emplacement_Parametre() ; on cherche la position à laquelle il faut écrire les paramètres du programme
FileSeek(0, Position)
WriteData(0, @Txt, #ParamLenght) ; on ecrit les paramètres du programme
CloseFile(0) ; on ferme le fichier
EndIf
; MessageRequester("", Programme + Chr(10) + "'" + Parametres + "'", 0)
RenameFile(Programme + ".bak", Left(Programme, Len(Programme))) ; on remet le nom d'origine de l'exe
RunProgram(Programme, "#Supprime", GetPathPart((ProgramFilename()))) ; on supprime l'exe temporaire
End ; on quitte le programme
EndProcedure
Procedure Supprime_TempExe()
Protected Temps.l
Temps = ElapsedMilliseconds()
Repeat
Delay(100)
; On supprime le fichier jusqu'a ce que la suppression soit bien effectué pendant au maximum 3 secondes
Until DeleteFile("Temp.exe") Or ElapsedMilliseconds() - Temps > 3000
; MessageRequester("", "Suppression de l'exe temporaire", 0)
End ; on quitte le programme
EndProcedure
;- Debut du programme
Parametre.s = ProgramParameter()
Select Parametre
Case "#Ecriture"
Enregistre_Parametre() ; on enregistre les parametres
Case "#Supprime"
Supprime_TempExe() ; on supprime l'exécutable temporaires
EndSelect
; On lit les paramètres
Texte.s = Lecture_Parametre()
; On demande à l'utilisateur de changer le texte que l'on souhaite enregistrer comme paramètres
Texte = InputRequester("Texte", "Tapez le texte à enregistrer dans l'exécutable :", Trim(Texte))
; On écrit les paramètres
; Cela quitte obligatoirement le programme, il faut donc le placer à la fin
Ecriture_Parametre(Texte)
;- Data qui permet d enregistrer les parametres
DataSection
Data.s "Texte de détection de la DataSectionVide Fin de la DataSection"
; #ParamLenght représente la longueur maximum du nombre de données que l'on peut enregistrer, il faut donc mettre autant d'espace que #ParamLenght
EndDataSection
j'ai essayé de bien commenté mon super code mais si un point n'est pas clair, n'hésitez pas à me poser la question.

Et n'oubliez pas que je suis un génie (d'après Fred) donc dorénavant, vous vous agenouillerez devant moi quand je posterais sur le forum
