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