Sous windows, plusieurs erreurs
1) j'ai corrigé ceci pour que ça marche chez moi mais il faudra écrire une fonction dynamique qui donne le chemin de PB quelque soit le dossier ou il est et quelque soit la version de PB
Code : Tout sélectionner
Global gConf_PureBasic_Path.s = #PB_Compiler_Home
Global gConf_Path_PBCOMPILER.s = #PB_Compiler_Home + "compilers\pbcompiler.exe"
Global gConf_Path_FASM.s = #PB_Compiler_Home + "compilers\fasm.exe"
Global gConf_Path_OBJ2LIB.s = #PB_Compiler_Home + "compilers\polib.exe"
Global gConf_Path_PBLIBMAKER.s = #PB_Compiler_Home + "Library SDK\LibraryMaker.exe"
ensuite, des erreurs avec la ligne suivante
Code : Tout sélectionner
;{ Create ASM Files
Protected lFile.l
ForEach LL_DLLFunctions()
lFile = CreateFile(#PB_Any, gConf_ProjectDir + "ASM" + #System_Separator + LL_DLLFunctions()\FuncName + ".asm")
Il faut absolument tester lFile car il est possible que ça échoue. Ces tests sont vrais pour la plupart des choses, y compris la création de gadgets.
Puis,
Je n'ai jamais eu de fichier asm généré par ton code (Vista + PB 4.30 beta 4)
Avant d'aller plus loin, j'ai écrit une fonction qui semble bien fonctionner (j'ai fait des tests sous Vista/XP, PB 4.20 et PB 4.30 beta 4).
Dans tous mes tests, je n'ai jamais eu de fichier asm sans avoir mis le drapeau "/EXE", il faut aussi ajouter celui-ci
"/INLINEASM " car le code PB peut comporter des lignes en asm
La voici, tu l'adaptes pour ton projet si tu veux.
Code : Tout sélectionner
Procedure.l CreateAsmFile(FichierPureBasic$)
; Retourne #true si le fichier asm a correctement été créé sinon retourne une valeur négative
; qui dépend du lieu de l'erreur, permet de trouver rapidement ou se situe l'erreur
Protected extension$ = LCase(GetExtensionPart(FichierPureBasic$))
; mémorise le nom du fichier asm avec le chemein complet
Protected FichierAsm$ = ""
; mémorise le nom du fichier exe, mais en fait la variable est vide
Protected FichierExe$ = ""
; mémorise le chemin et le nom du fichier asm initial créé par PB
Protected FichierInitialAsm$ = ""
; mémorise la chaine retournée par le compilateur lors de la création du fichier asm
Protected Sortie$ = ""
; mémorise le résultat de la fonction Runprogram
Protected Compilateur
; on teste si le fichier se fini par "pb ou pbi"
; si oui on continue sinon on retourrne #False
Select extension$
Case "pb"
FichierAsm$ + Mid(GetFilePart(FichierPureBasic$), 1, Len(GetFilePart(FichierPureBasic$))-2) + "asm"
; on fixe le nom du fiche executable
FichierExe$ + Mid(GetFilePart(FichierPureBasic$), 1, Len(GetFilePart(FichierPureBasic$))-2) + "exe"
Case "pbi"
FichierAsm$ + Mid(GetFilePart(FichierPureBasic$), 1, Len(GetFilePart(FichierPureBasic$))-3) + "asm"
; on fixe le nom du fiche executable
FichierExe$ + Mid(GetFilePart(FichierPureBasic$), 1, Len(GetFilePart(FichierPureBasic$))-3) + "exe"
Default
; ce n'est pas un fichier PB, on quitte
ProcedureReturn -1
EndSelect
; le fichier asm Prebasic.asm est créé dans le dossier de l'éxécutable qui le crée
FichierInitialAsm$ = GetCurrentDirectory() + "PureBasic.asm"
; on efface le fichier asm qui existerait éventuellement sous le même nom et sous le nom PureBasic.asm
; on efface éventuellement le fichier asm plus ancien
SetFileAttributes(FichierAsm$, #PB_FileSystem_Normal)
DeleteFile(FichierAsm$)
; on efface éventuellement le fichier Pb asm
SetFileAttributes(FichierAsm$, #PB_FileSystem_Normal)
DeleteFile(FichierInitialAsm$)
Compilateur = RunProgram(#PB_Compiler_Home + "\Compilers\pbcompiler", Chr(34) + FichierPureBasic$ + Chr(34) + " /INLINEASM /COMMENTED /EXE " + Chr(34) + FichierExe$ + Chr(34) , "", #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide)
If Compilateur
While ProgramRunning(Compilateur)
Sortie$ + ReadProgramString(Compilateur) + Chr(13)
Wend
EndIf
If ProgramExitCode(Compilateur) = 0
MessageRequester("", Sortie$, 16)
; on teste si le résultat est Ok
; la dernière ligne retournée vaut
; "- Feel the ..PuRe.. Power -"
; If FindString(Sortie$, "- Feel the ..PuRe.. Power -", Len(Sortie$)-28)
If FindString(Sortie$, "- Feel the ..PuRe.. Power -", 0)
; on efface le fichier executable créé
DeleteFile(FichierExe$)
; on renomme le fichier asm PureBasic.asm avec le nouveau nom
If RenameFile(FichierInitialAsm$, FichierAsm$)
ProcedureReturn #True
Else
ProcedureReturn -1
EndIf
Else
; on efface le fichier executable créé
DeleteFile(FichierExe$)
ProcedureReturn -2
EndIf
Else
; on efface le fichier executable créé
DeleteFile(FichierExe$)
ProcedureReturn -3
EndIf
EndProcedure
Toujours sous windows, le fichier desc doit être au format LIB et pas OBJ car depuis la version 3 de PB, le format lib a été introduit, il permet de n'inclure que les fonctions nécessaires à l'éxécutable au contraire du format OBJ qui introduira l'ensemble des commandes même si elles ne sont pas utilisées.
Je vais continuer