Sphinx (le tailbite du pauvre )

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Sphinx (le tailbite du pauvre )

Message par Zorro »

Salut,

je vous présente Sphinx , un petit code , qui permet de se creer a moindre frais une librairie (rien que ça :lol: )

bon il s'agit d'une petite astuce, mais qui a le mérite de fonctionner tres bien :)

pour faire une Librairie , il vous faut deja ecrire le code d'une DLL
une DLL c'est un ensemble de ProcedureDLL() , donc rien de compliqué !

par exemple , ici je vais utiliser le code suivant qui represente donc ma future Librairie :
Sauvegardez le quelque part sous le nom (par exemple) "ma_librairie.pb"

Code : Tout sélectionner


; Exemple de Librairie a compiler en DLL
; Le fichier *.Lib sera generé avec le meme nom que votre DLL

; Code "operations.dll "  a compiler en DLL
ProcedureDLL.i AttachProcess(Instance)
EndProcedure   
; Called when the program release (free) the DLL    ;
ProcedureDLL.i DetachProcess(Instance)
EndProcedure   
;Both are called when a thread in a program call Or release (free) the DLL    ;
ProcedureDLL.i AttachThread(Instance)
EndProcedure  
ProcedureDLL.i DetachThread(Instance)
EndProcedure

;************** LA LIB ******************************
;START_LIB
ProcedureDLL.i addi(a,b)
		ret=a+b
		ProcedureReturn ret
EndProcedure
ProcedureDLL.i sous(a,b)
		ret= a-b
		ProcedureReturn ret
EndProcedure
ProcedureDLL.i divi(a,b)
		ret=a/b
		ProcedureReturn ret
EndProcedure
ProcedureDLL.i multi(a,b)
		ret=a*b
		ProcedureReturn ret
EndProcedure
;STOP_LIB




; Epb

pour que ça marche, il faut ABSOLUMENT mettre la ligne
;START_LIB
au debut de la liste des ProcedureDLL composant votre lib
et
;STOP_LIB
a la fin !!
c'est grace a ces balises que je repere le nom des Procedures qui servirons dans la librairie ....

bref pour le test ne changez rien :)

ensuite vous lancez "Sphinx" , et vous cliquez sur le seul bouton "Make Lib"
Sphinx va vous demander de choisir le Fichier *.pb de votre librairie DLL ( "ma_librairie.pb" pour notre exemple )

faites le , et confirmer .... voila c'est tout :lol:

Explication

Sphinx va alors charger le fichier "ma_librairie.pb"
lire son contenu et fabriquer un fichier temporaire d'import avec le nom des procedures "ma_librairie.poi"
il va compiler une Dll avec le nom "ma_librairie.dll"
et générer en meme temp un fichier *.lib ( "ma_librairie.lib")
puis il va générer un fichier *Imp ( "LIB_ma_librairie.imp")
celui-ci sera généré dans l'emplacement "PureLibrairies/Windows" de votre Purebasic !!
et enfin va effacer le fichier temporaire "ma_librairie.poi"

les fonctions de cette librairie seront toujours disponible lorsque vous coderez (tout comme Tailbite :) )

par exemple pour testez entrez ce code dans un nouvel onglet ,qui reprends l'utilisation d'une des Proceduredll de notre librairie

Code : Tout sélectionner

debug divi(10,2)
ça va afficher "5" -->> (10/2)

si vous distribuez vos créations, n'oubliez pas d'inclure la Dll créé par Sphinx ;)


alors, alors ?? vous en pensez quoi ???


haaaa oui , j'ai oublié de mettre le code de Sphinx :mrgreen:

le voici :

Code : Tout sélectionner

;***********************************************
;Titre  :*Sphinx
;Auteur  : Zorro
;Date  :11/09/2017
;Heure  :09:37:08
;Version Purebasic :  PureBasic 5.60 (Windows - x86)
;Version de l'editeur :EPB V2.64
; Libairies necessaire : Aucune 
;***********************************************

;{- Enumerations / DataSections
;{ Windows
Enumeration
		#Win
EndEnumeration
;}
;{ Gadgets
Enumeration
		#Titre
		#Text_1
		#Button_Make
EndEnumeration
;}
;{ Fonts
Enumeration
		#Font_Titre
EndEnumeration
;}
Define.l Event
;}
; **************************************************************************
Declare openwindow_win()
Declare create_poi(file_pb.s,file_poi.s,file_lib.s)
Declare compile_dll(file_pb.s,file_dll.s)
Declare.s compile_imp(file_poi.s, path_imp.s)

Enumeration
		#file
EndEnumeration

Global Path_home.s=GetCurrentDirectory()
;;chemin_compiler_32$ =#PB_Compiler_Home+"Compilers\"+"pbcompiler.exe"
; ***************************************************************************

OpenWindow_Win()
;{- Event loop
Repeat
		Event = WaitWindowEvent(12)
		Select Event
				; ///////////////////
				Case #PB_Event_Gadget
				Select EventGadget()
						Case #Titre
						Case #Text_1
						Case #Button_Make				
						File_pb.s=OpenFileRequester( "choisir le fichier PB DLL_source",GetCurrentDirectory(),"*.*",0) ; fichier a compiler en DLL						
						Chemin_Travail.s=GetPathPart(File_pb.s)
						File_dll.s=Chemin_Travail.s+GetFilePart(File_pb.s,#PB_FileSystem_NoExtension)+".dll"
						File_lib.s=GetFilePart(File_pb.s,#PB_FileSystem_NoExtension)+".lib"
						File_imp.s="Lib_"+ GetFilePart(File_pb.s,#PB_FileSystem_NoExtension)+".imp"
						File_poi.s=Chemin_Travail.s+GetFilePart(File_pb.s,#PB_FileSystem_NoExtension)+".poi"				
						path_imp.s= Chr(34)+#PB_Compiler_Home + "PureLibraries\Windows\" + File_imp.s+Chr(34)
						Create_POI(File_pb.s,File_poi.s,File_lib.s)
						Compile_Dll(File_pb.s,File_dll.s)
						compile_imp(File_poi.s, path_imp.s) 
						MessageRequester( "Rapport","La librairie "+ File_imp.s + " est crée "+Chr(10)+" a cet endroit : "+Chr(10)+#PB_Compiler_Home + "PureLibraries\Windows\")
						End
				EndSelect
				; ////////////////////////
				Case #PB_Event_CloseWindow
				Select EventWindow()
						Case #Win
						CloseWindow(#Win)
						Break
				EndSelect
		EndSelect
ForEver
;
;}

;- Zone Procedures
Procedure OpenWindow_Win()
		;by zorro
		If OpenWindow(#Win, 568, 158, 260, 174, "Sphinx", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
				;If CreateGadgetList(WindowID(#Win))
				TextGadget(#Titre, 60, 5, 140, 40, "SPHINX ")
				TextGadget(#Text_1, 65, 45, 65, 15, "By Dobro")
				ButtonGadget(#Button_Make, 75, 105, 105, 35, "Make Lib")
				; Gadget Fonts
				SetGadgetFont(#Titre, LoadFont(#Font_Titre, "Microsoft Sans Serif", 24, #PB_Font_Bold|#PB_Font_HighQuality))
				;EndIf
		EndIf
EndProcedure
;
Procedure Create_POI(File_pb.s,File_poi.s,File_lib.s)
		;by zorro
		NewList List.s()
		OpenFile(#file,File_pb.s)
				While Eof(#file) = 0         
						Ligne.s=ReadString(#file)    
						Ligne.s=Trim(Ligne.s," ") ; retire espaces
						Ligne.s=Trim(Ligne.s,Chr(9)) ;retire TAB
						If LCase(Ligne.s)=";stop_lib"						
								Flag=#False
						CloseFile(#file)
						; ecriture du poi								
						OpenFile(#File,File_poi.s)
								WriteStringN(#file,"Import "+Chr(34)+File_lib.s+Chr(34))
								ForEach List.s()
										WriteStringN(#File,List.s())
								Next
								WriteStringN(#file,"EndImport")
						CloseFile(#file)
						ProcedureReturn
				EndIf
				If Flag=#True ; on creer la list							
						If FindString(Ligne.s,"ProcedureDll" ,1,#PB_String_NoCase)>0
								AddElement(List.s())
								posdep=FindString(Ligne.s,"(")		 
								Ligne.s=ReplaceString( Ligne.s," ","",#PB_String_NoCase ,posdep)	
								List.s()=StringField(Ligne.s,2," ") ; recup ce qui suit "ProcedureDll"
						EndIf
				EndIf
				If LCase(Ligne.s)=";start_lib"
						Flag=#True ; la ligne suivante commence la lib
						EndIf				
				Wend
		CloseFile(#file)
EndProcedure
;
Procedure Compile_Dll(File_pb.s,File_dll.s)
		;by zorro
		Shared Sortie$
		Compiler = RunProgram(#PB_Compiler_Home + "Compilers\pbcompiler.exe",File_pb.s + " /dll  /exe " + File_dll.s, "", #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide)
		If Compiler
				While ProgramRunning(Compiler)
						If AvailableProgramOutput(Compiler)
								Sortie$ + ReadProgramString(Compiler) + Chr(13)
						EndIf
				Wend
				CloseProgram(Compiler)
		EndIf
EndProcedure
;
Procedure.s compile_imp(File_poi.s, path_imp.s)
		;by zorro
		; Merci a Chi ;o)
		Shared Sortie$
		Compiler = RunProgram(#PB_Compiler_Home + "Compilers\pbcompiler.exe",File_poi.s + " --Import " + path_imp.s, "", #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide)
		If Compiler
				While ProgramRunning(Compiler)
						If AvailableProgramOutput(Compiler)
								Sortie$ + ReadProgramString(Compiler) + Chr(13)
						EndIf
				Wend
				CloseProgram(Compiler)
		EndIf
		
		DeleteFile(File_poi.s)
EndProcedure



Video de Demo ici :
https://youtu.be/YweWfWxALzs
Dernière modification par Zorro le mar. 12/sept./2017 14:34, modifié 7 fois.
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Sphinx (le tailbite du pauvre )

Message par Zorro »

j'oubliais, avant de tester le resultat, et apres avoir generé votre Lib
relancez le compilateur !! ou quittez et relancez l'editeur .... pour que votre lib soit reconnue

je n'y avais pas pensé car EPb lui lance le compilo a la volée , alors que l'editeur officiel
laisse en permanence le compilo en Ram
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Sphinx (le tailbite du pauvre )

Message par Kwai chang caine »

Bonjour ZORRO
Merci du partage 8)

Bah j'en pense que la librairie "LIB_ma_librairie.imp" n'est pas crée chez moi dans le dossier "PureLibraries\Windows\", ni nulle par ailleurs dans le dossier PB :|
J'ai essayé de créer dans ce dossier un TXT, pour voir si j'avais les autorisations et le TXT se créé..donc c'est pas ça ..

Et ce bon vieux CreateGadgetList, il est obligatoire ??
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Sphinx (le tailbite du pauvre )

Message par Zorro »

Kwai chang caine a écrit :Bonjour ZORRO
Merci du partage 8)

Bah j'en pense que la librairie "LIB_ma_librairie.imp" n'est pas crée chez moi dans le dossier "PureLibraries\Windows\", ni nulle par ailleurs dans le dossier PB :|
J'ai essayé de créer dans ce dossier un TXT, pour voir si j'avais les autorisations et le TXT se créé..donc c'est pas ça ..

Et ce bon vieux CreateGadgetList, il est obligatoire ??

non le gadgetlist n'est pas indispensable, c'est parceque j'ai fait l'interface avec Pure_form de Gnozal
et qu'il genere toujours cette condition , j'ai editer mon code


la librairie est créé dans le dossier de Purebasic , chez moi ça donne ici
D:\Dobro\Purebasic_5_60\86\PureLibraries\Windows\
<--- la dedans

a la fin de la creation Sphinx t'indiques par un message requester ou il a posé la lib !
si tu ne vois pas le requester, c'est que ça plante avant ...

je viens de retester chez moi ça marche :)

les raisons d'un plantage possible c'est
1- qu'il ne puisse pas generer le fichier *.poi (en principe il est crée dans le meme endroit que le source de la DLL )
tu peux mettre un calldebugger pour verifier si la creation a lieu ? juste apres "Create_POI()" dans le bouton

2- que le source de ta dll n'ait pas les balises ";START_LIB" et ";STOP_LIB" ....

sinon, je vois pas
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Sphinx (le tailbite du pauvre )

Message par Kwai chang caine »

Non tout marche nickel, j'ai le MsgBox qui indique bien le bon chemin que tu me donnes, chez moi ça donne ça
D:\A\J\C\H\E\PB\v5.60\PureLibraries\Windows\
mais y'a quedal de plus dans ce dossier qui se créé :|
Peut être le point dans le chemin ?? :idea:
Dernière modification par Kwai chang caine le lun. 11/sept./2017 11:22, modifié 1 fois.
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Sphinx (le tailbite du pauvre )

Message par Zorro »

oui peut etre, perso j'utilise "_" c'est plus conventionnel dans les nom de fichiers/dossiers
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Sphinx (le tailbite du pauvre )

Message par Kwai chang caine »

Bon bah j'ai remplacé le point par l'underscore...et pas mieux :|
On va attendre de voir si je suis le seul comme dab :lol:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Sphinx (le tailbite du pauvre )

Message par Zorro »

Ce que tu peux essayer c'est de remplacer

Code : Tout sélectionner

 path_imp.s= #PB_Compiler_Home + "PureLibraries\Windows\" + File_imp.s
(ligne 62)
par

Code : Tout sélectionner

 path_imp.s= GetCurrentDirectory()+ File_imp.s
tu trouvera alors le fichier "Lib_nom de ta librairie.imp" dans le meme dossier que Sphinx
tu copies a la main le fichier Imp dans ton dossier "PureLibraries\Windows\"
tu relances ton compilateur et ça dois le faire :)

ensuite tu testes avec ce code :

Code : Tout sélectionner

debug divi(10,2)
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Sphinx (le tailbite du pauvre )

Message par Kwai chang caine »

Bon j'ai trouvé, le problème est ailleurs
J'avais mis ton code dans un dossier bien à ton nom... "D:\A\Q\B\Sphinx (Le tailleBite du pauvre) v5.60 [Zorro]" et c'est le mot "pauvre" ou "bite" qui lui a pas plu :lol:
Non je déconne ce doit être les espaces ou crochets, etc...
Il faudra que tu mettes une protection d'info contre les caractères spéciaux dans le chemin :wink:

Bon maintenant il me créé bien le fichier "Lib_ma_librairie.imp"
Mais quand je relance le compilo de l'IDE ou même si je redémarre complétement à l'instruction

Code : Tout sélectionner

Debug divi(10,2)
J'ai un MsgBox du compilo
File not found "ma_librairie.lib"
:|
Si ta lib doit être dans "PureLibraries\Windows\Libraries" et ben chez moi elle y est pas
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Sphinx (le tailbite du pauvre )

Message par Zorro »

c'est normal je pense :)

lorsque tu compiles le code de test , il faut que celui ci soit sauvé dans un dossier ou se trouve les fichier DLL + Lib

je l'ai signalé , lorsqu'on distribue notre creation (donc le test ici ) il faut distribuer aussi la Dll et le fichie r*Lib !! :)

lorsque tu compiles sans sauvegarder, je pense, que l'IDE officiel, compile dans le dossier du Compiler par defaut
et dans ce dossier les 2 fichiers DLL et LIB n'y sont pas !!

en clair, creer un dossier de travail ,
met dedans la dll (la librairie en fait ) et le fichier lib

sauvegarde ton test comme test.pb (code "Divi(10,2) , et lance le apres, ça va le faire :)

ton dossier doit avoir le fichier *.DLL de la lib
le fichier *.lib de la lib

et ton programme qui fait appel a la librairie ..

le fait d'avoir le fichier *.imp dans le dossier "PureLibraries\Windows\"
permet juste d'utiliser la librairie pendans la mise au point du prg ....
pendant la compilation de l'executable ... comprends tu yau de poil ???


Si ta lib doit être dans "PureLibraries\Windows\Libraries" et ben chez moi elle y est pas
non , j'ai jamais dit ça !!

j'ai dit :
"PureLibraries\Windows\"
c'est pas pareil !!

autre chose :
avec l'editeur Officiel , vérifiez bien que vous utilisez le bon compilateur ....
si comme moi vous disposez de plusieurs compilo de Purebasic de version différente
ne compilez pas avec la 5.42 un code faisant appel a une fonction de votre librairie
qui elle se trouve dans la version 5.60 ...
c'est clair que ça ne marchera pas :lol:

je vais faire une video
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Sphinx (le tailbite du pauvre )

Message par Kwai chang caine »

Bon, on progresse, j'ai compilé et déposé les DLL et LIB à coté du code source
Maintenant j'ai ça
Image
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Sphinx (le tailbite du pauvre )

Message par Zorro »

tu compiles avec la bonne version de compilateur ??
t'a bien relancer le compilo ??? (menu compiler -> restart compiler )

le fichier "*.imp" est bien dans le dossier "Purebasic_5_60\86\PureLibraries\Windows"

voir video ici :
https://youtu.be/YweWfWxALzs
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Sphinx (le tailbite du pauvre )

Message par Zorro »

KCC tu travail a l'envers !! voila pourquoi tu n'y arrive pas :)

suit mes directives suivantes :

tu creer un dossier "mon_prg"

tu poses dedans le source de ta librairie ma_lib.Pb (librairie qui doit respecter les normes que j'impose (lhistoire des balises)
tu peux copier coller mon code exemple
une fois que tu as SAUVEGARDé le fichier PB de la source de la lib

tu lances Sphinx , tu choisis le fichier source de la lib
Sphinx va generer les fichiers Dll ,Lib dans le dossier "mon_prg" puisque tu travailles dedans
et envoyer le *. imp dans le compilo (si tu n'as pas touché au listing ) sinon si tu as fait la modif , c'est a toi de poser le fichier *.imp au bon endroit
tu relances le compilateur .....

tu creer un nouveau prg , celui qui se servira de la librairie , toujours dans le meme dossier "mon_prg"

tu ecris debug addi(5,3) , sauves ce prg, et tu le compiles , ça doit marcher et te renvoyer "8"

simple non ?

par la suite, si tu veux coder un autre prg dans un autre dossier qui utilise les nouvellles fonctions de la lib
il faut prealablement copier le fichiers Dll dans la racine du nouveau dossier de ton futur prg :)
(c'est un tailbite du pauvre, je l'avais dis hein ... :) )

je viens de tester si la migration fonctionne , et elle fonctionne :)

le fichier *.imp lui ne bouge pas, il reste dans le compilateur dans le dossier \PureLibraries\Windows\


voir la video ici : voir video ici :
https://youtu.be/YweWfWxALzs

;)
Dernière modification par Zorro le lun. 11/sept./2017 15:36, modifié 2 fois.
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Sphinx (le tailbite du pauvre )

Message par Kwai chang caine »

Ca marche nickel !!!
Je sais pas ce qui merdait.... en dehors des caractères spéciaux de mon premier dossier :oops:
Merci beaucoup ZORRO 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Sphinx (le tailbite du pauvre )

Message par Zorro »

bon, ben tant mieux, je commençais a désespérer :lol:
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Répondre