Page 1 sur 1

Equiv fonciont put() vb6 en PureBasic

Publié : lun. 05/déc./2016 10:49
par jmg49
Bonjour

je cherche à reproduire la fonction put() vb6 qui permet de concaténer des données dans un fichier ouvert en rw avec un séparateur string entre par exemple,

put #1 , startbyte, variable1 & variable2 & variable3

où variable1 contient donnéesficher1 variable2 séparateur string variable3 donnéesfichier2


j'ai essayé ceci mais je ne vois pas le séparateur dans un éditeur hexa ...

Code : Tout sélectionner

separateur.s ="testseparatation"

ReadFile(#file2, "stub.exe")        
                 length2 = Lof(#file2)  
                  
                  *MemoryID2 = AllocateMemory(length2)
                  bytes2.i = ReadData(#file2, *MemoryID2, length2)
                  CloseFile(#file2)
                  
                  
                  
                  
                  ReadFile(#file1,"C:\kkrunchy\Onewstars.exe")
                  length = Lof(#file1)
                  *MemoryID = AllocateMemory(length)
                  bytes = ReadData(#file1, *MemoryID, length)
                  CloseFile(#file1)
                            
                  
                  CreateFile(#result, "result.exe")
                  
                  WriteData(#result,  *MemoryID2 , length2)
                  FileSeek(#result, Lof(#result))          
                  WriteString(#result, separateur.s)
                  WriteData(#result,  *MemoryID , length)
                  CloseFile(#result)
file1 fait 470 ko
stub.exe fait 4ko

mon result.exe en sortie fait 474 ko

merci de vos conseils

Re: Equiv fonciont put() vb6 en PureBasic

Publié : lun. 05/déc./2016 11:12
par Zorro
a tout hasard (pas testé ) :)

Code : Tout sélectionner


CreateFile(#result, "result.exe")
		
		WriteData(#result,  *MemoryID2 , length2)
		FileSeek(#result, Lof(#result))         
		WriteString(#result, separateur.s)
		pos=Loc(#result) ; ajout Zorro
		FileSeek(#result,pos+len(separateur.s)   ) ; ajout Zorro
		WriteData(#result,  *MemoryID , length)
CloseFile(#result)

Re: Equiv fonciont put() vb6 en PureBasic

Publié : lun. 05/déc./2016 11:27
par jmg49
Merci,
je viens de tester , je ne trouve qu'un séparateur dans l'éditeur hexa c'est à la déclaration de la variable, mais pas d'ajout supplémentaire ... :(

Re: Equiv fonciont put() vb6 en PureBasic

Publié : lun. 05/déc./2016 13:18
par Zorro
au lieu de chercher a bouger le pointeur d'ecriture du disque
on peut eventuelleent tout faire en Ram

(si j'ai bien compris le truc, tu cherches a concatener 2 prg en les separant par un "separateur" (attention de ne pas utiliser la valeur '0')

ce code est purement theorique, je n'ai rien tester , je te laisse faire :)
le but etant de faire la concatenation en Ram
je creer une nouvelle zone memoire *MemoryID3
dans lequel je tente de poser (*MemoryID2 , le separateur , puis *MemoryID)

puis ensuite, j'ecris que "*MemoryID3" puisque tout devrai etre formé ... (a verifier mode debug et Pas a Pas )

Code : Tout sélectionner

separateur.s ="testseparatation"

ReadFile(#file2, "stub.exe")       
		length2 = Lof(#file2) 
		
		*MemoryID2 = AllocateMemory(length2)
		bytes2.i = ReadData(#file2, *MemoryID2, length2)
CloseFile(#file2)


ReadFile(#file1,"C:\kkrunchy\Onewstars.exe")
		length = Lof(#file1)
		*MemoryID = AllocateMemory(length)
		bytes.i = ReadData(#file1, *MemoryID, length)
CloseFile(#file1)

*MemoryID3 = AllocateMemory(length2+length+len(separateur.s)) ; on creer une zone memoire de la taille des 2 prg + le separateur
CopyMemory(*MemoryID2, *MemoryID3, length2) ; on copie le prg2 dans a nouvelle zone
CopyMemory(@separateur.s, *MemoryID3+length2+1, length2) ; on ajoute le separateur (pas sur pour le "+1")
CopyMemory(*MemoryID, *MemoryID3+length2+1+len(separateur.s), length) ; on copie le prg1 dans a nouvelle zone (pas sur pour le "+1")

; on peut effacer les anciennes memoire, tout devrai etre dans la nouvelle zone memoire "*MemoryID3"
FreeMemory(*MemoryID)
FreeMemory(*MemoryID2)

; on ecrit l'ensemble de la zone memoire 3
CreateFile(#result, "result.exe")		
		WriteData(#result,  *MemoryID3 , MemorySize(*MemoryID3 ))		
CloseFile(#result)

Re: Equiv fonciont put() vb6 en PureBasic

Publié : lun. 05/déc./2016 16:36
par djes
Pourquoi faire un FileSeek() ?
Quelques remarques :
  • Tu devrais tester tes valeurs de retour, là tu risques la cata. Sauf si ça ne sert qu'une fois.
  • Pour ton séparateur, il faut fixer le format, car suivant le compilo tu vas avoir des résultats différents.
  • Enfin, je ne vois pas l'intérêt de mettre un séparateur plutôt qu'une table en début de fichier qui t'indiquera rapidement où se trouvent les données intégrées.