les bases d'un interpreteur/et pseudo compilation en *.Exe

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: les bases d'un interpreteur/et pseudo compilation en *.E

Message par G-Rom »

ChrisR a écrit : G-Rom as-tu un petit exemple "simple" pour la lecture des lignes de la zone Data à interpréter ?
Pour comparaison avec l'exemple de zorro et le read de la SectionData.
avec l'ajout d'une taille , d'un offset & d'un terminator pour détecté la présence d'une source ou pas :

Code : Tout sélectionner

#TERMINATOR = 65355

Procedure SelfAppend(File.s, Destination.s)
  ; quel est l'exe courant ?
  *buffer   = AllocateMemory(4096)
  If *buffer
    PathSize  = GetModuleFileName_(#Null, *buffer, #MAX_PATH + 1)
    Exe$      = PeekS(*buffer,PathSize)  
    FreeMemory(*buffer)
  Else
    ProcedureReturn -1
  EndIf 

  If ReadFile(0,Exe$)
    *selfBuffer = AllocateMemory(Lof(0))
    
    If *selfBuffer
      
      ; on copie l'exe en mémoire
      ReadData(0,*selfBuffer,Lof(0))
      CloseFile(0)
      
      ; on lis le fichier source a rajouté
      If ReadFile(0,File)
        *fileBuffer = AllocateMemory(Lof(0))
        If *fileBuffer
          
          ReadData(0,*fileBuffer,Lof(0))
          CloseFile(0)
          
          finalSize = MemorySize(*selfBuffer) + MemorySize(*fileBuffer) + 12
          *finalBuffer = AllocateMemory(finalSize)
          
          CopyMemory(*selfBuffer,*finalBuffer,MemorySize(*selfBuffer))
          CopyMemory(*fileBuffer,*finalBuffer + MemorySize(*selfBuffer), MemorySize(*fileBuffer))
          
          PokeL(*finalBuffer + finalSize - 12 , MemorySize(*selfBuffer)) ; write offset
          PokeL(*finalBuffer + finalSize - 8  , MemorySize(*fileBuffer)) ; write size          
          PokeL(*finalBuffer + finalSize - 4  , #TERMINATOR)             ; write terminator
          
          FreeMemory(*selfBuffer)
          FreeMemory(*fileBuffer)
          
          CreateFile(0,Destination)
          WriteData(0,*finalBuffer,finalSize)
          CloseFile(0)
          FreeMemory(*finalBuffer)

          Debug "!"
        Else
          ProcedureReturn -1
        EndIf        
      Else
        ProcedureReturn -2
      EndIf
    Else
      ProcedureReturn -1  
    EndIf
  Else 
    ProcedureReturn -2   
  EndIf 
  
EndProcedure


Procedure.l GrabContent()
    ; quel est l'exe courant ?
  *buffer   = AllocateMemory(4096)
  If *buffer
    PathSize  = GetModuleFileName_(#Null, *buffer, #MAX_PATH + 1)
    Exe$      = PeekS(*buffer,PathSize)  
    FreeMemory(*buffer)
  Else
    ProcedureReturn -1
  EndIf 
  If ReadFile(0,Exe$)
    *selfBuffer = AllocateMemory(Lof(0))
    If *selfBuffer
      ; on copie l'exe en mémoire
      ReadData(0,*selfBuffer,Lof(0))
      CloseFile(0)
      check = PeekL(*selfBuffer+MemorySize(*selfBuffer)-4)
      If check <> #TERMINATOR
        ProcedureReturn 0
      Else
        size   = PeekL(*selfBuffer+MemorySize(*selfBuffer)-8)
        offset = PeekL(*selfBuffer+MemorySize(*selfBuffer)-12)
        *data = AllocateMemory(size)
        CopyMemory(*selfBuffer+offset,*data,size)
        FreeMemory(*selfBuffer)
        ProcedureReturn *data
      EndIf
    EndIf 
  EndIf
EndProcedure


*data = GrabContent() 
If *data = 0
  MessageRequester("Attention !","L'executable est vide ! veuillez choisir un fichier à mettre dedans !")
  SelfAppend(#PB_Compiler_File, GetPathPart(#PB_Compiler_File)+"Concat.exe")  
Else
  MessageRequester("Attention !" , "L'executable contient des données")
  
  OpenWindow(0,0,0,640,480,Str(MemorySize(*data)))
  EditorGadget(0,0,0,640,480)
  
  string$ = PeekS(*data,MemorySize(*data),#PB_Ascii)
  
  SetGadgetText(0,string$)
  
  While #True 
    Repeat
      event = WindowEvent()      
      If event = #PB_Event_CloseWindow
        End
      EndIf      
    Until event = 0
  Wend
EndIf 


Avatar de l’utilisateur
ChrisR
Messages : 235
Inscription : sam. 14/févr./2015 16:20

Re: les bases d'un interpreteur/et pseudo compilation en *.E

Message par ChrisR »

Merci G-Rom
je vais regarder ce soir en rentrant à la maison.
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: les bases d'un interpreteur/et pseudo compilation en *.E

Message par G-Rom »

D'ailleurs attention a ne pas utilisé ces procédures en production, les retours sont géré à l'arrache...
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: les bases d'un interpreteur/et pseudo compilation en *.E

Message par Kwai chang caine »

GRom a écrit :Pourtant , je le dit bien, "ne pas faire un simple Run" , ce qui veut dire un coup de F5... ;)
Oui maitre !!
Ton jeune padawan a pourtant suivi tes recommandations à la lettre, comme la minuscule feuille du roseau obtempère à la petite brise du matin, un jour de pleine lune :D

Et c'est le bon ChrisR qui a sauvé mon honneur de par ces quelques mots aussi agréable à mes yeux, qu'un jus tiède de miel à une gorge torturée par la douleur d'un virus hivernal 8)
ChrisR a écrit :Et, le 1er exe créer ne doit pas être Concat.exe sinon il ne peut pas être écrasé une fois lancé.
Voici donc ce que je n'aurais pas du faire :oops:
Point n'est besoin que tu déplaces ta grandeur jusqu'à mon chevet...je m'auto-flagelerais allégrement et sans vergogne, dans la triste solitude que désespérément je mérite

En tout cas merci à vous deux d'avoir éclairé le chemin de la connaissance que j'essaie désespérément de parcourir, vous suivant toujours de très, pour ne pas dire de trop... loin 8)

Et avec ton dernier code ...ça marche !!!!! .... 8O
La magie de noël opère encore :mrgreen:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Répondre