Page 1 sur 1

Compilateur Requester

Publié : mar. 23/févr./2016 23:47
par falsam
Suite à une demande de Microdevweb sur FreeChat.

Ce code permet d’interroger le compilateur et de lister
- Les mots-clefs.
- Les constantes
- Les structures internes
- Les interfaces internes

Décocher l'option unicode dans les options du compilateur.

Code : Tout sélectionner

CompilerIf #PB_Compiler_Unicode
  CompilerError "Décocher l'option unicode dans les options du compilateur"
CompilerEndIf

Define.s Result

Define.i CompilerRequester = RunProgram(#PB_Compiler_Home+"compilers\pbcompiler.exe","/STANDBY","",#PB_Program_Open|#PB_Program_Read|#PB_Program_Write|#PB_Program_Hide)

If CompilerRequester 
  If ProgramRunning(CompilerRequester)
    WriteProgramStringN(CompilerRequester, "FUNCTIONLIST") ;Options possible "FUNCTIONLIST", "STRUCTURELIST", "CONSTANTLIST", "INTERFACELIST"
    While Not FindString(result, "OUTPUT" + #TAB$ + "COMPLETE")
      result  = ReadProgramString(CompilerRequester)
      Debug result
    Wend
    CloseProgram(CompilerRequester)  
  EndIf 
EndIf
Ca peut vous servir si vous souhaitez créer un éditeur maison ou un RAD :wink:

Re: Compilateur Requester

Publié : mer. 24/févr./2016 7:45
par Anonyme2
On peut également utiliser IMPORTLIST
IMPORTLIST

Request a listing of all imported functions known by the compiler.
Parameters: none
Response : The first line contains the number of imported functions, then all the imported function name with there arguments,
each on its own line.
The output is terminated by a line containing 'OUTPUT<T>COMPLETE'.
J'utilise ce type de code (code de danilo sur le forum anglais) depuis plusieurs mois, il fonctionne aussi avec l'option unicode.

Il y a quelques explications (en anglais) dans le fichier CompilerInterface.txt du dossier \SDK de PB, en particulier pour obtenir le détail des structures etc.

La liste des imports ne comporte pas uniquement des API window (pour ceux qui utilisent Linux et autre je ne sais pas) mais aussi des commandes de scintilla par exemple si je me souviens bien.

Le code complet de Danilo est ici
http://www.purebasic.fr/english/viewtop ... 12&t=53701

Pour pouvoir utiliser le code en unicode (pas la compilation mais le retour du compilateur), j'utilise ceci

Code : Tout sélectionner

Procedure StartCompiler_x64_Unicode()
      ProcedureReturn RunProgram(GLB_Compiler_x64_Unicode$, "/STANDBY /UNICODE", "",#PB_Program_Open|#PB_Program_Read|#PB_Program_Write|#PB_Program_Hide)
EndProcedure
et ceci en Ascii

Code : Tout sélectionner

Procedure StartCompiler_x64_Ascii()
      ProcedureReturn RunProgram(GLB_Compiler_x64$, "/STANDBY", "",#PB_Program_Open|#PB_Program_Read|#PB_Program_Write|#PB_Program_Hide)
EndProcedure
j'ai donc ajouté /UNICODE aux options après /STANDBY

Je le répète, les 2 modes de compilation fonctionnent dans mon projet sans que j'ai pu détecter de problème.

J'ai fait beaucoup de tests.

Il y a des constantes qui existent en 64 bits et pas en 32 bit et réciproquement.
De mémoire, ce sont celles de la librairie OnError, par exemple celles liées aux registres du processeur

Code : Tout sélectionner

PB_OnError_Rax
est définie en 64 bit mais pas en 32 et

Code : Tout sélectionner

PB_OnError_Eax
existe en 32 et pas en 64 bit bien que Eax soit une partie de Rax.

De la même manière, des constantes unicode ont des valeurs différentes en ascii

Code : Tout sélectionner

LVM_GETCOLUMN  vaut  4121 en ascii et 4191 en unicode
Je me suis écrit mon propre outil pour afficher tout ça d'un coup, le visualisateur de structures/constantes de PB ne fonctionne pas toujours correctement même en redémarrant le compilateur, par exemple sur un nouveau fichier j'ai redémarré le compilateur en 32 bit car j'étais en 64 et impossible de voir la constante PB_OnError_Eax. J'ai fermé PB et redémarré en 32 bits et c'est OK.


Image
Affichage de toutes les structures dans tous les modes

Image
Affichage de toutes les constantes dans tous les modes

Re: Compilateur Requester

Publié : mer. 24/févr./2016 11:54
par falsam
Bonjour Denis.

Merci pour ce commentaire. L'objectif du tout petit code que j'ai donné est de pouvoir l'intégrer dans un IDE ou un RAD maison plus facilement qu'avec le code de Danilo.

Re: Compilateur Requester

Publié : mer. 24/févr./2016 12:17
par Anonyme2
Bonjour Falsam,

j'ai bien compris.

Il faut se forcer à travailler en unicode, la suppression de l'ascii arrive à grand pas.

Pour lire l'ensemble des modes en interrogeant les compilateurs 32 et 64 bits, je met environ 25 secondes pour tout charger, c'est très long avec mon asus de 6 ans (64 bits). J'ai expérimenté des threads pour interroger les compilateurs mais il manquait des choses, je m'y suis surement mal pris.

J'ai raccourci le temps en créant un fichier Json (ça marche vraiment bien, plus simple que le xml) et je l'enregistre une fois pour toute, ça met ensuite moins de 5 secondes pour tout charger. Si je viens à ajouter des choses (commande utilisateur ou résident, j'efface le Json et je relance le processus.