Sphinx (le tailbite du pauvre )
Publié : lun. 11/sept./2017 8:54
Salut,
je vous présente Sphinx , un petit code , qui permet de se creer a moindre frais une librairie (rien que ça
)
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"
pour que ça marche, il faut ABSOLUMENT mettre la ligne
et
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
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
ç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
le voici :
Video de Demo ici :
https://youtu.be/YweWfWxALzs
je vous présente Sphinx , un petit code , qui permet de se creer a moindre frais une librairie (rien que ça

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
au debut de la liste des ProcedureDLL composant votre lib;START_LIB
et
a la fin !!;STOP_LIB
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

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)
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

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