Page 1 sur 1

Enregistrer des paramètres directement dans l'exécutable

Publié : jeu. 08/avr./2004 14:23
par Le Soldat Inconnu
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 :
Si 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.
Je prends au mot ce qu'a dis Fred donc je suis un as de la programmation :mrgreen:

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 :mrgreen: (j'en profite largement, hein ? mais ne vous inquiétez pas pour mon ego, il est indestructible)

Publié : jeu. 08/avr./2004 14:28
par Chris
...mais ne vous inquiétez pas pour mon ego, il est indestructible
:splat: :splat: :splat: :splat: :splat:

Chris :)

Publié : jeu. 08/avr./2004 17:08
par nico
Moi, il me parait que de tout le Forum, c'est quand même toi qui pose le plus de question! (de la part d'un génie, on s'attend plus à des réponses!)
8)
Au début, j'ai même cru que ce site avait été conçu dans ce but!
(surtout que t'es Admin)
:lol:

Mais bon, c'est bien joué

Bravo l'artiste!
:D

Publié : jeu. 08/avr./2004 19:45
par Oliv
bravo, au grand comandeur des croyants...(iznogoud serait-il parmis nous ? mais le qualif ?)

Re: Enregistrer des paramètres directement dans l'exécutable

Publié : ven. 09/juil./2004 15:45
par Patrick88
Le Soldat Inconnu a écrit :Et n'oubliez pas que je suis un génie
oh, Génie !! faudrait s'en faire bouillir les neurones , ton code ne fonctionne plus avec la dernière version de pb(3.91) = erreur sur le allocatememory...

(pourquoi "s'en faire... " ? parce que en mettant "t'en faire..." le jeu de mot
"génie sans bouillir" est moins visisble ... (ahahahah )

pat

désolé, j'pouvais pas loupé ça.... :oops: :roll: :wink:

Publié : dim. 06/août/2006 15:50
par wolfjeremy
:( J'ai rien capter

Il serait possible que tu le rende compatible PB4 ?

Et avoir des explications :oops: par exemple comment modifier les variable : variable1.s, variable2.s, variable3.s et variable4.s dans un exe nommé "monexe.exe" (lol)

Merci d'avance pour ton aide.

Publié : mar. 28/oct./2008 13:37
par Xizvak
Hello, merci pour ces réponses. Je pense que je vais faire autrement car ça foire chez moi :s

Merci quand même.

Publié : mar. 28/oct./2008 23:33
par Le Soldat Inconnu
Ha, faut que je prenne un peu de temps pour refaire tout ça pour les dernières versions de pb alors :roll:
Méchant Fred qui fait trop de mise jour de PureBasic, ca me casse mes jolis codes ....

Publié : mar. 28/oct./2008 23:54
par Le Soldat Inconnu
Et voila, c'est fait, voir code plus haut

Publié : mer. 29/oct./2008 19:10
par Ollivier
Salut LSI,

Je profite d'avoir un pied sur le gazon, l'autre pied sur le rebord d'une barque et les coucougnettes au dessus d'une eau bien fraîche, bref je profite d'être en quelque sortes tombé là le même jour que toi pour te remercier pour quelques uns de tes punaises de code qui déchirent.

Donc merci à toi.

Olliv

Publié : dim. 30/nov./2008 23:25
par Fortix
Excellent!!
je me rappel à une certaine époque m'ettre penché sur ce problème, mais sans succè :oops:

Je me prosterne votre altess...

celà dit, une nouvelle génération de virus vont appaitres d'ici peu, je le craind :!:

je me prépar au pire :cry:

Publié : lun. 01/déc./2008 12:19
par Ar-S
Image Image Image

Ô Grand LSI, le truc de malade !

Publié : mer. 03/déc./2008 20:53
par Cls
Fortix a écrit :celà dit, une nouvelle génération de virus vont appaitres d'ici peu, je le craind :!:
Ce genre de virus existe depuis près de 15 ans déjà. Pas de nouveauté à craindre à ce niveau. Je ne m'étendrais pas sur le sujet, on en a discuté il y a quelques années... ;) (pour la petite histoire ça avait créé un peu de remous)