commande shell?????

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Fortix
Messages : 559
Inscription : mar. 30/mai/2006 17:03

commande shell?????

Message par Fortix »

je veux comprendre comment on utilise les commandes shell de purebasic
un ou deux exemples c'est plus parlant mais c'est comme vous voulez!, merki :roll:
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

De quoi parle tu ?
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

2 manières de faire sous windows, les autre OS, je ne sait pas

Sous windows, soit on accède à la fenêtre dos (sous XP elle s'appelle invite de commandes) et ensuitte on tape toutes les commandes nécessaires pour lancer le compilateur suivi des paramètres voulus

Je ne donne pas les commandes, c'est long et fastidieux, on pourrait faire un fichier bat mais à quoi bon (?)

soit par programme

voici un exemple pour créer le fichier asm à partir du fichier pb
Comme on dépend encore des commandes dos, on doit séparer les chaînes par Chr(34) sinon ça ne marche pas bien voire pas du tout

le compilateur va générer un fichier asm dans le dossier Compilers nommé Purebasic.asm, ensuite je le copie dans le dossier voulu en le renommant

Il faudrait fignoler la commande Runprogram avec un canal de communication et lire le résultat retourné par le compilateur

Si c'est Ok, le compilateur retourne en chaîne de fin :

- Feel the ..PuRe.. Power -

J'ai fait plein d'essais (plutôt infructueux :roll: ). il en ressort que l'on est obligé de mettre la commande /EXE mais sans nom de fichier, celà permet de créer l'asm sans que l'exe ne soit créer. On peut aussi lire tous les process et fermer celui qui a été créé par pb mais ça alourdi le code, ca fonctionne bien comme ceci

Pour les autres commandes, il faut faire des essais ... jamais très simple avec ces commandes

je pense que c'est ce que tu voulais


voici l'exemple

Code : Tout sélectionner

Procedure.s CheminPureBasic()
   ; retourne le chemin du dossier Purebasic quelque soit l'OS sous windows
   cbData = (#MAX_PATH * 2) + 2
   lpbData = AllocateMemory(cbData)
   If GetVersion_() & $ff0000 ; Windows NT/XP
      If RegOpenKeyEx_(#HKEY_CLASSES_ROOT, "Applications\PureBasic.exe\shell\open\command", 0, #KEY_ALL_ACCESS, @hKey1) = #ERROR_SUCCESS
         If RegQueryValueEx_(hKey1, "", 0, @Type, lpbData, @cbData) = #ERROR_SUCCESS
            Folder$ = PeekS(lpbData)
            Folder$ = GetPathPart(Mid(Folder$, 2, Len(Folder$) - 7))
         EndIf
         RegCloseKey_(hKey1)
      EndIf
   Else ; The same for Win9x
      If RegOpenKeyEx_(#HKEY_LOCAL_MACHINE, "Software\Classes\PureBasic.exe\shell\open\command", 0, #KEY_ALL_ACCESS, @hKey1) = #ERROR_SUCCESS
         If RegQueryValueEx_(hKey1, "", 0, @Type, lpbData, @cbData) = #ERROR_SUCCESS
            Folder$ = PeekS(lpbData)
            Folder$ = GetPathPart(Mid(Folder$, 2, Len(Folder$) - 7))
         EndIf
         RegCloseKey_(hKey1)
      EndIf
   EndIf
   FreeMemory(lpbData)
   ProcedureReturn Folder$
EndProcedure



; on teste si le fichier Purebasic.asm du dossier Compiler existe, si oui on l'efface
; pour être sur que la fonction a réussi


Chemin_PB.s = CheminPureBasic()
Fichier_PureBasic.s = Chemin_PB + "Projets\Fortix.pb"
Fichier_asm.s = Chemin_PB + "Projets\Fortix.asm"

If ReadFile(0, Fichier_asm) <> 0
   ; on le supprime
   CloseFile(0)
   If DeleteFile(Fichier_asm) = 0
      ; le fichier n'a pas pu être effacé
      MessageRequester("Attention","Le fichier "+Fichier_asm+Chr(10)+"n'a pas pu être effacé"+Chr(10)+Chr(10)+"ferez le fichier ou l'application qui utilise ce fichier avant de recommencer",16)
   Else
      a = RunProgram(Chemin_PB + "Compilers\PBCompiler.exe", Chr(34)+ Fichier_PureBasic + Chr(34)                 + " /INLINEASM /COMMENTED /EXE " + Chr(34) , CheminPureBasic()+ "Projets\", #PB_Program_Wait)
   EndIf
   
Else
      a = RunProgram(Chemin_PB + "Compilers\PBCompiler.exe", Chr(34)+ Fichier_PureBasic + Chr(34)                 + " /INLINEASM /COMMENTED /EXE " + Chr(34) , CheminPureBasic()+ "Projets\", #PB_Program_Wait)
EndIf

; on fait une copie du fichier asm en le renommant
If CopyFile(Chemin_PB+"Compilers\Purebasic.asm", Fichier_asm)
   Taille = FileSize(Fichier_asm)
   MessageRequester("Création de fichier asm PureBasic", "Le fichier asm  " + Fichier_asm + "  a été créé     " + Chr(10) + Chr(10) + "Taille du fichier : " + Chr(10) + Str(Taille) + " octets", $40)
Else
   MessageRequester("Création de fichier asm PureBasic","Impossible de créer le fichier asm",$40)
EndIf
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Voici une version amélioré avec le canal de communication (lecture du retour du compilateur)

A modifier pour ajouter une openfilerequester pour pouvoir choisir son fichier à transformer

Code : Tout sélectionner

Procedure.s CheminPureBasic()
   ; retourne le chemin du dossier Purebasic quelque soit l'OS sous windows
   cbData = (#MAX_PATH * 2) + 2
   lpbData = AllocateMemory(cbData)
   If GetVersion_() & $ff0000 ; Windows NT/XP
      If RegOpenKeyEx_(#HKEY_CLASSES_ROOT, "Applications\PureBasic.exe\shell\open\command", 0, #KEY_ALL_ACCESS, @hKey1) = #ERROR_SUCCESS
         If RegQueryValueEx_(hKey1, "", 0, @Type, lpbData, @cbData) = #ERROR_SUCCESS
            Folder$ = PeekS(lpbData)
            Folder$ = GetPathPart(Mid(Folder$, 2, Len(Folder$) - 7))
         EndIf
         RegCloseKey_(hKey1)
      EndIf
   Else ; The same for Win9x
      If RegOpenKeyEx_(#HKEY_LOCAL_MACHINE, "Software\Classes\PureBasic.exe\shell\open\command", 0, #KEY_ALL_ACCESS, @hKey1) = #ERROR_SUCCESS
         If RegQueryValueEx_(hKey1, "", 0, @Type, lpbData, @cbData) = #ERROR_SUCCESS
            Folder$ = PeekS(lpbData)
            Folder$ = GetPathPart(Mid(Folder$, 2, Len(Folder$) - 7))
         EndIf
         RegCloseKey_(hKey1)
      EndIf
   EndIf
   FreeMemory(lpbData)
   ProcedureReturn Folder$
EndProcedure


Procedure.b CreateAsm(FichierPureBasic.s)
  ; retourne #true si le fichier asm a correctement été créé sinon retourne #false
  If LCase(GetExtensionPart(FichierPureBasic)) = "pb"
      FichierAsm.s = Mid(GetFilePart(FichierPureBasic), 1, Len(GetFilePart(FichierPureBasic)) - 2) + "asm"
      FichierExe.s = Mid(GetFilePart(FichierPureBasic), 1, Len(GetFilePart(FichierPureBasic)) - 2)
      CheminAsm.s = GetPathPart(FichierPureBasic)
  Else
      ; ce n'est pas un fichier PB, on quitte
         ProcedureReturn #False
  EndIf   
  Sortie$ = ""
  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
  DeleteFile(CheminAsm+FichierExe)
  If ProgramExitCode(Compilateur) = 0
      If FindString(Sortie$, "- Feel the ..PuRe.. Power -", Len(Sortie$)-28)
         ProcedureReturn #True
      Else
         ProcedureReturn #False
      EndIf
  Else
     ProcedureReturn #False
  EndIf
  
EndProcedure



Chemin_PB.s = CheminPureBasic()
Fichier_PureBasic.s = Chemin_PB + "Projets\Fortix.pb"
Fichier_asm.s = Chemin_PB + "Projets\Fortix.asm"

If ReadFile(0, Fichier_asm) <> 0
   ; on le supprime
   CloseFile(0)
   If DeleteFile(Fichier_asm) = 0
      ; le fichier n'a pas pu être effacé
      MessageRequester("Attention","Le fichier "+Fichier_asm+Chr(10)+"n'a pas pu être effacé"+Chr(10)+Chr(10)+"fermez le fichier ou l'application qui utilise ce fichier avant de recommencer",16)
   Else
      retour = CreateAsm(Fichier_PureBasic)
   EndIf
   
Else
      retour = CreateAsm(Fichier_PureBasic)
EndIf

If retour
    ; on fait une copie du fichier asm en le renommant
    If CopyFile(Chemin_PB+"Compilers\Purebasic.asm", Fichier_asm)
       Taille = FileSize(Fichier_asm)
       MessageRequester("Création de fichier asm PureBasic", "Le fichier asm  " + Fichier_asm + "  a été créé     " + Chr(10) + Chr(10) + "Taille du fichier : " + Chr(10) + Str(Taille) + " octets", $40)
    Else
       MessageRequester("Création de fichier asm PureBasic","Impossible de créer le fichier asm",$40)
    EndIf
Else
       MessageRequester("Création de fichier asm PureBasic","Impossible de créer le fichier asm",$40)
EndIf
RegisLG
Messages : 154
Inscription : mer. 22/juin/2005 2:32

Message par RegisLG »

Denis, pourquoi ne pas supprimer ta procédure CheminPureBasic() et utiliser

Code : Tout sélectionner

Chemin_PB.s = #PB_Compiler_Home
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

RegisLG a écrit :Plus court encore, gardons l'essentiel (Denis, #PB_Compiler_Home est ton ami ;)) :
Personne ne me l'a dit :mrgreen: (pas cherché la définiton excate de PB_Compiler_Home )
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

RegisLG a écrit :Denis, pourquoi ne pas supprimer ta procédure CheminPureBasic() et utiliser

Code : Tout sélectionner

Chemin_PB.s = #PB_Compiler_Home

Va savoir :D

l'important c'est d'utiliser le shell et la doc PB est extrêmement mal faite sur ce point. L'exemple ultra simple fonctionne, mais pas d'explications sur la syntaxe à utiliser pour les autres commandes.

Essayez de lancer diverses options du compilateur, ca se passe pas toujours bien, j'ai même complètement détruit un fichier pb (faites une sauvegarde avant de faire des essais)

Fred devrait implémenter un certain nombre de constantes équivalentes aux commandes shell et écrire une fonction du type Runcompileur(Param, #option)
RegisLG
Messages : 154
Inscription : mer. 22/juin/2005 2:32

Message par RegisLG »

Un truc qui m'échappe :
A partir de la ligne de commande sous xp, je tape ceci :
C:\Program Files\PureBasic\Projets>..\compilers\pbcompiler.exe "fortix.pb" /inlineasm /commented
A la fin de la compilation, l'executable est automatiquement lancé.

Par contre avec ton programme, l'executable n'est pas lancé (j'ai testé en mettant en commentaire la ligne 'DeleteFile(CheminAsm+FichierExe)').
Je ne comprends pas pourquoi, le même programme (pbcompiler.exe) a 2 comportements différents suivant qu'il est lancé en ligne de commande ou via un runprogram.

Une idée ?
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

RegisLG a écrit :Un truc qui m'échappe :
A partir de la ligne de commande sous xp, je tape ceci :
C:\Program Files\PureBasic\Projets>..\compilers\pbcompiler.exe "fortix.pb" /inlineasm /commented
A la fin de la compilation, l'executable est automatiquement lancé.

Par contre avec ton programme, l'executable n'est pas lancé (j'ai testé en mettant en commentaire la ligne 'DeleteFile(CheminAsm+FichierExe)').
Je ne comprends pas pourquoi, le même programme (pbcompiler.exe) a 2 comportements différents suivant qu'il est lancé en ligne de commande ou via un runprogram.

Une idée ?
Depuis les versions précédante de PB, il n'est pas possible de faire un asm sans créer un exe ou sans lancer la création d'un exe. J'ai déjà demandé à Fred d'avoir une commande pour créer un asm sans avoir ce comportement (toujours pas fait :roll: );

Si en ligne de commande tu ne demandes que l'asm sans la commande EXE/, tu as le lancement de l'exe (idem si on le fait par programme).
Erix14 utilisais la méthode Killprocess pour fermer immédiatement l'exe lancé et j'avais travaillé en parallèle sur les commandes du shell et je m'étais rendu compte dans mes essais que si on lancait également la commande EXE/ mais en ne donnant pas de nom à l'exe créer (voir la syntaxe de EXE/) on 'roulait le compilateur et le fichier asm était créé sans lancer l'exe.

La version 4, si on ne donne pas de nom à l'exe, l'asm est tout de même créé mais le linker renvoir une erreur d'accès, d'ou pas possible de tester la chaîne de retour du compilateur "- Feel the ..PuRe.. Power -"

C'est ce que fait le premier code que j'ai posté. C'est pour cela que j'efface le fichier PureBasic.asm dans le dossier du compilateur, pour être sur que si je teste ensuite sa présence, c'est que le compilateur l'a bien créé.

Le deuxième code lit la chaîne retournée par le compilateur et si je veux être sur, il faut pouvoir récupérer "- Feel the ..PuRe.. Power -"

D'après mes essais (mais je me trompe peut-être) , on est obligé de mettre la commande EXE/ suivi d'un nom de fichier, c'est ce que j'ai fait dans le deuxième code, l'exe est créé mais pas lancé !
Ensuite j'efface cet exe qui ne me sert pas.
Avatar de l’utilisateur
Fortix
Messages : 559
Inscription : mar. 30/mai/2006 17:03

enfin compris la commande shell!

Message par Fortix »

Denis je te remerci beaucoup pour ton explication et surtous pour ton exemple
(bien chiadé en tous cas! :D ) , je peux enfin élargir mon champ d'action :2gunfire: , encore merci!
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Message par Fig »

désolé de remonter ce fil, mais je n'ai toujours pas réussi a sortir un fichier Asm commenté malgres mes recherches dans le forum.

Quelqu'un pourrait il m'indiquer la procedure à suivre point par point ...

mon fichier pb est situé ici : c:\test\test.pb
mon compilateur pb est la : c:\program files\purebasic\compilers

et m'indiquer ou je retrouve le fichier asm.

1000 fois merci !!!

Autre question, pourquoi on a pas une commande dans l'IDE pour sortir le fichier asm ? (actuellement j'utilise la jaPBe et la version 4.00 demo)
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Message par Fig »

j'arrive a compiler mon fichier, ensuite il se lance mais aucune trace de fichier .asm

Je commence a devenir fou la :cry:
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Message par Fig »

Le doute m'assaille... Est ce que ca ne marcherait pas en version démo ???
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Message par Fig »

Et bien, je viens d'essayer avec la version complete, ca marche ! Donc c'est une des limitations de la version d'essais. Je ne l'avais pas vu sur la doc...
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Fig a écrit :Autre question, pourquoi on a pas une commande dans l'IDE pour sortir le fichier asm ? (actuellement j'utilise la jaPBe et la version 4.00 demo)
La création de l'asm fonctionne bien avec les commandes dos, peut-être que la version de démo ne permet pas la création de l'asm

En plus, l'utilisation des macros par Fred dans le fichier asm ne facilite pas forcément la lisibilité


Voici une saisie d'écran avec les commande pour faire l'asm

Rien de plus simple, sous l'invite des commandes dos (j'espère que tu connais un peu les commandes dos)

un fois que tu es dans le dossier Compilers, tu tapes ceci

PBcompiler C:\test\test.pb /commented


attention, il y a un espace entre pb et la barre /

si ton fichier pb est correct, le fichier purebasic.asm est créé dans le dossier compilers et l'exe sera lancé

Image
Répondre