Page 1 sur 2

Import DLL dans Purebasic

Publié : lun. 09/mars/2020 17:32
par threedslider
Salut,

C'est possible à partir d'une DLL écrit en C++ peut importer dans Purebasic ? J'ai un fonction void qui affiche simple un texte genre hello. Comment Créer un exécutable en Purebasic chargeant la DLL ? Comment on écrit en quelques codes comme exemple ?

Merci votre aide sera bienvenue !

Re: Import DLL dans Purebasic

Publié : lun. 09/mars/2020 20:29
par Naheulf
C'est tout à fait possible. Je pense que tu devrait trouver ton bonheur dans l'aide de la bibliothèque "Library" intégrée à PureBasic ainsi que dans l'exemple fourni sur la page des "Prototypes" ;)

Re: Import DLL dans Purebasic

Publié : lun. 09/mars/2020 21:53
par kernadec
bsr à tous
je ne code plus bcp en PB pour le moment..

mais pour une question sur les DLL, je connais un peu le sujet...
voici deux codes qui utilisent deux maniere pour envoyer des paramétres à une DLL
et recuperer les données calculées par celle-ci
en 2008 j'ai utilisé des prototypes, il y a deux codes dont le second fait a l arrache
qui utilise le mode globale pour les variables prototypes c'est une astuce de "User_Russian" du forum anglais

https://www.purebasic.fr/french/viewtop ... f=3&t=8459

dans cet autre code j'utilise la commande CallFunction()

https://www.purebasic.fr/french/viewtop ... =3&t=14026

j'oubliais, :wink: j 'ai fais ca aussi pour avoir la listes de fonctions d'une DLL

https://www.purebasic.fr/french/viewtop ... =6&t=10202

j’espère que ces exemples pourront t'aider

Cordialement

Re: Import DLL dans Purebasic

Publié : jeu. 07/mai/2020 14:11
par kernadec
bjr à tous
l'autre jour j'avais omis de mentionner ce programme que j'utilise et en plus gratuit
il est très utile pour connaitre les paramètres des fonctions d'un fichiers dll
https://www.alternate-tools.com/pages/c ... p?lang=ENG

Cordialement

Re: Import DLL dans Purebasic

Publié : mer. 20/mai/2020 16:26
par threedslider
Merci à tous !

Désolééé pour le retard de la réponse.

Re: Import DLL dans Purebasic

Publié : ven. 21/août/2020 9:43
par threedslider
Ok je vais plus simple (hyper simple !) de comment cela marche la DLL dans Purebasic :)

Voici le code :

Code : Tout sélectionner

Procedure Function()
  
  res=OpenLibrary(0,"test.dll")
  
  If res
    Calling = CallFunction(0, "SomeFunction")
    
   CloseLibrary(0)
    Else
    MessageRequester("ERROR","Cant find DLL in Path",0):End
  EndIf
  
EndProcedure

  

 
OpenConsole()
If Function()
  
  PrintN("It is working !!")
  Delay(5000)

EndIf
Ok tout là cela marche bien comme test mais comment afficher la fonction SomeFunction (c'est un void function) sans paramètre appelé par la DLL dans Purebasic?

Pourriez vous m'aider, svp ?

Le fichier DLL : ==>> https://www.dropbox.com/s/s9cu3se9zq8wh71/test.dll?dl=0

Re: Import DLL dans Purebasic

Publié : ven. 21/août/2020 10:21
par venom
chez moi ta dll test ne renvoi aucune fonction. :?
Voici le code que j'utilise pour analyser une dll :

Code : Tout sélectionner

Enumeration
  #Viewver
  #Button_LoadDll
  #ListIcon_dll
EndEnumeration

Procedure LoadDLL()
  ClearGadgetItems( #ListIcon_dll )
  
  Dll.s = OpenFileRequester ( "ouvrir une dll", "", "Dynamic link library (*.dll)|*.dll", 0)
  
  If Dll <> ""
    SetWindowTitle ( #Viewver, "open dll : " + GetFilePart (Dll))
    OpenLibrary (0, Dll)
    
    ExamineLibraryFunctions (0)
    
    While NextLibraryFunction () <> 0
      AddGadgetItem ( #ListIcon_dll, -1, LibraryFunctionName () + Chr (10) + Str ( LibraryFunctionAddress ()))
    Wend
    CloseLibrary (0)
  EndIf
  
EndProcedure

If OpenWindow ( #Viewver, 0, 0, 600, 450, "open dll", #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered)
  ListIconGadget ( #ListIcon_dll, 10, 40, 580, 400, "nom de la fonction", 288, #PB_ListIcon_GridLines )
   AddGadgetColumn ( #ListIcon_dll, 1, "Address", 288)
    ButtonGadget ( #Button_LoadDll, 235, 10, 130, 20, "Ouvrir une dll" )

EndIf

Repeat
  EventID = WaitWindowEvent()
  If EventID = #PB_Event_Gadget
    Select EventGadget()
        
      Case #Button_LoadDll
        LoadDLL()
        
    EndSelect
  EndIf
Until EventID = #PB_Event_CloseWindow
Tu peux voir que rien n'apparait. :wink:
A compiler en 32 ou 64 bits en fonction de la dll bien sur.





@++

Re: Import DLL dans Purebasic

Publié : ven. 21/août/2020 10:36
par threedslider
Ma test.dll marche chez moi en 32 bits sauf que je ne sais pas comment afficher le print par la fonction SomeFunction()...

Ton code est très bien, elle affiche la fonction SomeFunction à l'adresse 1954549824... mais je veux moi afficher ma fonction dans purebasic, comment on fait cela ?

Re: Import DLL dans Purebasic

Publié : ven. 21/août/2020 10:50
par venom
Etrange, chez moi rien ne s'affiche dans ta dll 8O
PB 5.72






@++

Re: Import DLL dans Purebasic

Publié : ven. 21/août/2020 11:00
par threedslider
ok oui c'est étrange donc j'ai compilé en exe, est ce cela marche chez toi pour voir ?

https://www.dropbox.com/s/8qx82i1ikkuwe ... l.zip?dl=0

Re: Import DLL dans Purebasic

Publié : ven. 21/août/2020 11:11
par venom
Non, chez moi ça reste vide. Tu essaye bien avec la Dll que tu as mis sur DropBox ?






@++

Re: Import DLL dans Purebasic

Publié : ven. 21/août/2020 11:18
par threedslider
Et ça ?

https://www.dropbox.com/s/9msaxq14w6w5dm5/test.zip?dl=0

J'ai compressé comme ça c'est l'original sans modification par externe...

Re: Import DLL dans Purebasic

Publié : ven. 21/août/2020 11:33
par threedslider
Sinon je mets tout, la DLL et la Lib ?

peut être c'est ça qui manque, non ?

https://www.dropbox.com/s/wccjmogo2zbi6 ... 2.zip?dl=0

Re: Import DLL dans Purebasic

Publié : ven. 21/août/2020 11:55
par venom
Non aucune fonction de retour.

Voici un code qui fait (je pense) ce que tu souhaite :

Code : Tout sélectionner

;{ Partie qui permet de creer la Dll 
Global ReturnString$

ProcedureDLL.s MaFonction() ; nom de la fonction qu'on retrouvera dans la Dll
 ReturnString$ = "Voici un texte dans une Dll !" ; texte que l'on souhaite recuperer
  ProcedureReturn ReturnString$
EndProcedure
;}


;{ Partie qui te permet de lire ta Dll
If OpenLibrary(0, "Chemin vers la Dll que tu aura creer avec le code ci-dessus."); on ouvre la Dll via son chemin
 String.s = PeekS(CallFunction(0, "MaFonction")); le nom de la fonction qui nous interesse dans la Dll (MaFonction). On fait appel a peeks pour lire une chaine de caractere en memoire
  Debug String.s ; on affiche le résultat. ça peux etre dans un print ou autre.
CloseLibrary(0)
EndIf
;}

; ces 2 codes sont bien evidement a separer ;)
le premier code sert a creer la Dll. Et le second a lire le contenue. J'ai commenter au mieux.
Ps : chez moi c'est ok

EDIT : Voici un zip avec tout pour tester en mode console :wink:






@++

Re: Import DLL dans Purebasic

Publié : ven. 21/août/2020 14:10
par threedslider
Merci beaucoup ! ça marche nickel !

Effectivement c'est une autre façon de faire mais je doute que tu as compilé DLL dans purebasic, non ?

Moi j'ai compilé en Visual studio pour la DLL, certain marche pour plus simple mais quand c'est plus complexe d'autre pas du tout... :-/