Page 1 sur 2

Import

Publié : sam. 11/juin/2016 17:01
par Shadow
Salut, j'ai regarder le tuto de micro sur comment faire une dll
mais ça ne fonctionne pas chez moi, ça dis que le point d'entrée
de la procédure est introuvable, blablabla...

Comment créer une dll et communiquer avec ?

Re: Import

Publié : sam. 11/juin/2016 17:24
par falsam
Faisant simple avec cette exemple qui va nous permettre de faire une addition.

■ Code de la DLL : MaDLL.pb

Code : Tout sélectionner

ProcedureDLL Addition(x,y)
  ProcedureReturn(x+y)
EndProcedure
0 - Tu sauvegardes
1 - Option de compilation : Format de l'exécutable -> Share DLL
2 - Tu crées ton exécutable en lui donnant le nom de MaDLL.DLL (C'est un exemple)

■ Code pour appeler la DLL : TestMaDLL.pb

Code : Tout sélectionner

Enumeration
  #MaDLL
EndEnumeration

If OpenLibrary(#MaDLL, "madll.dll")
  Debug CallFunction(#MaDll, "Addition", 40, 20)
  CloseLibrary(#MaDLL)
EndIf
Et bimmmMMmm ...... ça fonctionne ^^.

Re: Import

Publié : sam. 11/juin/2016 17:28
par Shadow
Super, merci Falsam :)

Par contre j'aurais voulue utiliser
"Import" plutôt, plus flexible :)

Re: Import

Publié : sam. 11/juin/2016 17:35
par falsam
Import avec une lib oui mais pas avec une DLL. (Sauf erreur ou omission de ma part)
Help a écrit :For advanced programmers. Import : EndImport allows to easy declare external functions and variables from a library (.lib) or an object (.obj) file.

Re: Import

Publié : sam. 11/juin/2016 17:50
par Shadow
Oui exacte Falsam c'est bien ça.
Et aussi comment partager des variable entre le programme Main et la Dll ?

Par exemple le Main appel une Dll qui a une fenêtre avec des champs
comment je retourne le contenue de ses champs au programme Main ?

Faut une variable, structure ?

Re: Import

Publié : sam. 11/juin/2016 18:04
par falsam
Si tu ne veux pas utiliser de fonctions comme CallFunction() dans ton code principale, tu peux créer un include qui contiendra des prototype de ta dll.

Exemple pour la fonction addition de la dll.

Code : Tout sélectionner

;// Ton include
Global MaDLL = OpenLibrary(#PB_Any, "madll.dll")

If MaDLL  
  Prototype.i ProtoAddition (x.i, y.i) 
  Addition.ProtoAddition = GetFunction(MaDLL, "Addition")
EndIf

;// Ton code principale
Debug Addition(2,3)

Re: Import

Publié : sam. 11/juin/2016 18:13
par falsam
Et parce que j'ai dit des bétises dans ma premiere réponse, je vais te répondre pour la solution avec la fonction Import()

Quand tu as crée MaDLL.Dll, lecompilateur génére aussi une lib. Donc la fonction import fonctionne.

Le code TestImportMaDLL.pb à sauvegarder dans le dossier contenant ta DLL.

Code : Tout sélectionner

Import "MaDLL.lib"
  Addition(x.i, y.i)
EndImport

Debug Addition(2, 3)

Re: Import

Publié : sam. 11/juin/2016 18:21
par Shadow
Merci et pour les variables, la partage de donné ?
J'voudrait faire un programme à base de blugins avec des Dll.

Re: Import

Publié : sam. 11/juin/2016 18:26
par falsam
Commence par essayer de mettre ta fenêtre dans une DLL et d'essayer de l'ouvrir depuis un main tout en intégrant la boucle événementielle et poste un code simple. (si ça fonctionne) :wink:

Re: Import

Publié : sam. 11/juin/2016 18:38
par Shadow
C'est bon c'est fais ça ;)
Mais je ne sais pas comment faire pour partager des données...

Re: Import

Publié : sam. 11/juin/2016 18:41
par falsam
falsam a écrit :et poste un code simple.
Il est ou le code ? ^^

Re: Import

Publié : sam. 11/juin/2016 18:47
par Shadow
J'voudrait faire un programme à base de blugins avec des Dll.
Il est en court, je commence juste !

Re: Import

Publié : sam. 11/juin/2016 18:57
par falsam
Alors un exemple sans savoir si c'est vraiment ça que tu veux.

■ Code de la dll contenant une fenetre ainsi que deux valeur à récupérer.

Code : Tout sélectionner

ProcedureDLL ShowWindow() 
  OpenWindow(0, 0, 0, 300, 300, "Fenetre de ma dll", #PB_Window_ScreenCentered)
  StringGadget(0, 20, 20, 80, 22, "A récupérer 0")
  StringGadget(1, 20, 50, 80, 22, "A récupérer 1")  
EndProcedure


ProcedureDLL.s GetValue(Gadget.i)
  ProcedureReturn GetGadgetText(Gadget)  
EndProcedure
■ Code de ton main.

Code : Tout sélectionner

Import "MaDLL.lib"
  ShowWindow()
  GetValue(Gadget.i)
EndImport

OpenWindow(0, 0, 0, 500, 500, "Test", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)

ShowWindow() ;
Debug PeekS(GetValue(0))
Debug PeekS(GetValue(1))

Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow

Re: Import

Publié : sam. 11/juin/2016 19:46
par Shadow
Merci Falsam, ton exemple fonctionne.
Voici le début de mon programme, tu verra que ça marche pas comme j'ai fais.

C'est la première fois que je fais ça.
Merci de ton aide :)

http://www.aht.li/2908075/PureAssictance_V1.zip

Re: Import

Publié : sam. 11/juin/2016 21:16
par microdevweb
Salut Shadow,

Mon tuto était plutôt l'inverse créer une Dll à partir d'un module. Il suffis simplement dans le code de la Dll d'inclure le module (Xinclude) de créer une fonction dans la Dll pour chaque fonction déclarée public du module en appelant la dite fonction (du module) le compilateur se chargera de tous le reste.