un ou deux exemples c'est plus parlant mais c'est comme vous voulez!, merki
commande shell?????
commande shell?????
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
un ou deux exemples c'est plus parlant mais c'est comme vous voulez!, merki
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
). 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
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
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)
EndIfVoici 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
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)
EndIfDenis, pourquoi ne pas supprimer ta procédure CheminPureBasic() et utiliser
Code : Tout sélectionner
Chemin_PB.s = #PB_Compiler_HomeRegisLG a écrit :Denis, pourquoi ne pas supprimer ta procédure CheminPureBasic() et utiliserCode : Tout sélectionner
Chemin_PB.s = #PB_Compiler_Home
Va savoir
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)
Un truc qui m'échappe :
A partir de la ligne de commande sous xp, je tape ceci :
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 ?
A partir de la ligne de commande sous xp, je tape ceci :
A la fin de la compilation, l'executable est automatiquement lancé.C:\Program Files\PureBasic\Projets>..\compilers\pbcompiler.exe "fortix.pb" /inlineasm /commented
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 faitRegisLG a écrit :Un truc qui m'échappe :
A partir de la ligne de commande sous xp, je tape ceci :A la fin de la compilation, l'executable est automatiquement lancé.C:\Program Files\PureBasic\Projets>..\compilers\pbcompiler.exe "fortix.pb" /inlineasm /commented
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 ?
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.
enfin compris la commande shell!
Denis je te remerci beaucoup pour ton explication et surtous pour ton exemple
(bien chiadé en tous cas!
) , je peux enfin élargir mon champ d'action
, encore merci!
(bien chiadé en tous cas!
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)
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
Version de PB : 6.00LTS - 64 bits
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'asmFig 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)
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é
