Page 3 sur 5

Publié : dim. 16/nov./2008 7:24
par Progi1984
Je ne sais pas si tu as vu le code de Moebius, mais tu as tout le code que j'utilise actuellement pour windows & linux :)

Mais si tu préfères, on peut finaliser la première version pour moebius pour windows et on verra aprés celle pour linux :)

Publié : dim. 16/nov./2008 8:58
par Anonyme2
Extrêmement pénible à télécharger un par un les fichiers.

Je vais regarder

Publié : dim. 16/nov./2008 11:12
par Progi1984
Tu peux tout récupérer via un

Code : Tout sélectionner

svn checkout http://moebius-pb.googlecode.com/svn/trunk/ moebius-pb-read-only

Publié : dim. 16/nov./2008 11:20
par Anonyme2
Ha bon ? :cry:

Publié : dim. 16/nov./2008 11:25
par Progi1984

Publié : dim. 16/nov./2008 12:47
par Anonyme2
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

Publié : dim. 16/nov./2008 13:12
par Anonyme2
Il manque cette ligne après le endselect pour donner le bon chemin au fichier asm de destination

Code : Tout sélectionner

     ; donne le bon chemin au fichier asm
     FichierAsm$ = GetPathPart(FichierPureBasic$) + FichierAsm$
     

Publié : dim. 16/nov./2008 13:32
par Progi1984
J'ai mis à jour le svn grâce à tes modifications :
http://code.google.com/p/moebius-pb/source/detail?r=13

Bon boulot :)

Publié : dim. 16/nov./2008 14:21
par Anonyme2
Comme je t'ai dit, il faut adapter à ton code, car le fichier asm Sample_00.asm est créé par mon code dans le dossier ou tourne l'exe, il faut l'adapter pour qu'il soit dans le dossier ..\Proj_Moebius\ voire \Proj_Moebius\Lib_Source

Publié : dim. 16/nov./2008 15:07
par Progi1984
J'ai modifié le code pour la génération du fichier ASM et mis à jour le SVN (http://code.google.com/p/moebius-pb/source/detail?r=14)

Le fichier généré se trouve dans "Proj_Moebius\Lib_Source\"+gProject\Name+"\PureBasic.asm". Comme ca, il restera dans le dossier du projet.

Publié : dim. 16/nov./2008 15:27
par Anonyme2
J'ai corrigé la procedure GetInfoLib à l'arache car le programme plantait.

Je rabache, mais on ne peut pas déplacer un pointeur dans un fichier sans savoir si on ne va pas dépasser la fin de fichier, sinon ça plante.

C'est exactement la même chose lorsque l'on écrit en mémoire, avant d'écrire, on regarde si on ne dépasse pas la dernière adresse de la mémoire, sinon ça plante. Si tu veux un code éprouvé, il faut des tests partout.

Par exemple, ExamineDirectory doit être testé avec un if et lorsque l'on a fini, on utilise FinishDirectory (tu dois réécrire ces codes pour ne pas planter).

Les AllocateMemory aussi, dans la procedure PB_GetInfoUserLib, il faut absolument tester au retour que le pointeur soit <> de 0

Code : Tout sélectionner

 *MemLib_Header = AllocateMemory(LibSize)
etc

Idem avec FreeMemory, si on a fait un test, le FreeMemory est dans le if donc normalement pas de problème, sinon on teste le pointeur.

Lorsque l'on alloue de la mémoire, toujours vérifier que la taille allouée est différente de 0 sinon ça plante.


Idem pour les Addelement() qui doivent être testés avant d'ajouter un élément.

Sinon, tu verras une fois que ça marche, pour les lib en mode unicode, treadsafe, il faut lire dans leur dossier respectif, je ne sais pas si ton code le fait mais pour l'instant c'est pas urgent.



Code : Tout sélectionner

Procedure PB_GetInfoLib(FileName.s)
     Protected LibName.s = GetFilePart(FileName)
     Protected hFile = ReadFile(#PB_Any, FileName)
     Protected Ndx.l
     
     Protected Filesize.q = FileSize(FileName)
     
     Debug FileName
     
     If hFile
          If Filesize>0
               
               Ndx = 2
               
               While ((Ndx>0) And ((Loc(hFile) + 1)<Lof(hFile)))
                    If ReadByte(hFile) = 0
                         Ndx-1
                    EndIf
               Wend
               
               If (Loc(hFile)<(Lof(hFile)-2))
                    FileSeek(hFile, Loc(hFile) + 2)
               EndIf
               
               While Eof(hFile) = 0
                    If AddElement(LL_PBFunctions())
                         LL_PBFunctions()\FuncName = ReadString(hFile)
                         ;    Debug LL_PBFunctions()\FuncName
                         LL_PBFunctions()\LibContaining = LibName
                         If (Loc(hFile)<(Lof(hFile)-2))
                              FileSeek(hFile, Loc(hFile) + 2)
                         Else
                              ; erreur
                              CloseFile(hFile)
                              ProcedureReturn -1  ; erreur sur le déplacement dans le fichier
                         EndIf
                    Else
                         ; erreur
                         CloseFile(hFile)
                         ProcedureReturn -1  ; erreur sur Addelement
                    EndIf
               Wend
               
               CloseFile(hFile)
          Else
               CloseFile(hFile)
               ProcedureReturn -1  ; erreur sur le fichier (taille ou inexsistant)
          EndIf
     Else
          ProcedureReturn -1  ; erreur sur l'ouverture du fichier
     EndIf
EndProcedure

Publié : dim. 16/nov./2008 15:40
par Anonyme2
Dans la procedure Moebius_Compile_Step2, j'ai adapté pour PB 4.30

Code : Tout sélectionner

                         CompilerIf #PB_Compiler_Version<430
                              ; Type of the Return Value
                              If Mid(LL_DLLFunctions()\FuncName, Len(LL_DLLFunctions()\FuncName)-1, 1) = "."
                                   Select Mid(LL_DLLFunctions()\FuncName, Len(LL_DLLFunctions()\FuncName), 1)
                                        Case "b" : LL_DLLFunctions()\FuncRetType = "Byte"
                                        Case "c" : LL_DLLFunctions()\FuncRetType = "Character"
                                        Case "d" : LL_DLLFunctions()\FuncRetType = "Double"
                                        Case "f" : LL_DLLFunctions()\FuncRetType = "Float"
                                        Case "q" : LL_DLLFunctions()\FuncRetType = "Quad"
                                        Case "s" : LL_DLLFunctions()\FuncRetType = "String"
                                        Case "w" : LL_DLLFunctions()\FuncRetType = "Word"
                                        Default : LL_DLLFunctions()\FuncRetType = "Long"
                                   EndSelect
                              Else
                                   LL_DLLFunctions()\FuncRetType = "Long"
                              EndIf
                              ; Type of Parameters
                              For IncA = 1 To CountString(LL_DLLFunctions()\Params, ",") + 1
                                   Select Right(Trim(StringField(LL_DLLFunctions()\Params, IncA, ",")), 1)
                                        Case "b" : LL_DLLFunctions()\ParamsRetType + ", Byte"
                                        Case "c" : LL_DLLFunctions()\ParamsRetType + ", Character"
                                        Case "d" : LL_DLLFunctions()\ParamsRetType + ", Double"
                                        Case "f" : LL_DLLFunctions()\ParamsRetType + ", Float"
                                        Case "q" : LL_DLLFunctions()\ParamsRetType + ", Quad"
                                        Case "s" : LL_DLLFunctions()\ParamsRetType + ", String"
                                        Case "w" : LL_DLLFunctions()\ParamsRetType + ", Word"
                                        Default : LL_DLLFunctions()\ParamsRetType + ", Long"
                                   EndSelect
                              Next
                         CompilerElse
                              ; Type of the Return Value
                              If Mid(LL_DLLFunctions()\FuncName, Len(LL_DLLFunctions()\FuncName)-1, 1) = "."
                                   Select Mid(LL_DLLFunctions()\FuncName, Len(LL_DLLFunctions()\FuncName), 1)
                                        Case "b" : LL_DLLFunctions()\FuncRetType = "Byte"
                                        Case "c" : LL_DLLFunctions()\FuncRetType = "Character"
                                        Case "d" : LL_DLLFunctions()\FuncRetType = "Double"
                                        Case "f" : LL_DLLFunctions()\FuncRetType = "Float"
                                        Case "l" : LL_DLLFunctions()\FuncRetType = "Long"
                                        Case "q" : LL_DLLFunctions()\FuncRetType = "Quad"
                                        Case "s" : LL_DLLFunctions()\FuncRetType = "String"
                                        Case "w" : LL_DLLFunctions()\FuncRetType = "Word"
                                        Default : LL_DLLFunctions()\FuncRetType = "Integer"
                                   EndSelect
                              Else
                                   LL_DLLFunctions()\FuncRetType = "Integer"
                              EndIf
                              ; Type of Parameters
                              For IncA = 1 To CountString(LL_DLLFunctions()\Params, ",") + 1
                                   Select Right(Trim(StringField(LL_DLLFunctions()\Params, IncA, ",")), 1)
                                        Case "b" : LL_DLLFunctions()\ParamsRetType + ", Byte"
                                        Case "c" : LL_DLLFunctions()\ParamsRetType + ", Character"
                                        Case "d" : LL_DLLFunctions()\ParamsRetType + ", Double"
                                        Case "f" : LL_DLLFunctions()\ParamsRetType + ", Float"
                                        Case "l" : LL_DLLFunctions()\ParamsRetType + ", Long"
                                        Case "q" : LL_DLLFunctions()\ParamsRetType + ", Quad"
                                        Case "s" : LL_DLLFunctions()\ParamsRetType + ", String"
                                        Case "w" : LL_DLLFunctions()\ParamsRetType + ", Word"
                                        Default : LL_DLLFunctions()\ParamsRetType + ", Integer"
                                   EndSelect
                              Next
                         CompilerEndIf

Publié : dim. 16/nov./2008 16:02
par Anonyme2
Oublie la prise en compte des integer, car je suis en train de corriger l'écriture du fichier desc et les integer ne semblent pas être supportés, je vais regarder encore et je te dirai quoi.

Publié : dim. 16/nov./2008 16:13
par Progi1984
Dans la release r15 :
IMPROVED : Verification of If, AddElement, AllocateMemory, ExamineDirectory
IMPROVED : Function PB_GetInfoLib

Dans la release r16 :
IMPROVED : Type of Variable Detection for PureBasic 4.30

On devrait déjà bosser sur une version pour PB 4.20 sans Unicode sans ThreadSafe. On verra quand on pourra compiler une userlib pour un code simple.

Encore merci de ton aide :)

Publié : dim. 16/nov./2008 16:21
par Anonyme2
Tout à fait d'accord

Pour ta fonction non reconnue, change dans ton code ceci, procedure Moebius_Compile_Step2()


remplace

Code : Tout sélectionner

LL_DLLFunctions()\FuncName = StringField(TrCodeField, 1, " ")
par

Code : Tout sélectionner

LL_DLLFunctions()\FuncName = StringField(TrCodeField, 2, " ")
car la fonction n'est jamais déclarée dans le fichier descripteur, avec cette modif, la déclaration y est (pour un exemple à une seule proceduredll pour l'instant, lorsque j'en déclare 2, le nom de la deuxième n'y est pas, le problème est là pour le descripteur, à creuser.