Page 1 sur 1

recherche d'une fonction dans une DLL

Publié : dim. 18/févr./2007 0:38
par minirop
bonjour,
je suis entrain d'essayer de faire un menu "pluginable", mais le problème c'est que "GetFunction" renvoie toujours 0.

Code : Tout sélectionner

        If(OpenLibrary(#lib, "plugins/"+DirectoryEntryName(#dossier)))
          If(GetFunction(#lib, "GetPluginName")) ; si je mets "PurePlugin" çà ne marche pas non plus.
            ;pwet !
          Else
            MessageRequester("error","Ceci n'est pas un plugin")
          EndIf
Les plugins ont ces fonction :

Code : Tout sélectionner

Procedure.l PurePlugin()
  ProcedureReturn 1
EndProcedure

Procedure.s GetPluginName()
  ProcedureReturn "Plugin One"
EndProcedure
à chaque fois j'ai "ceci n'est pas un plugin", alors que je suis sur que les DLL on bien cette fonction.

merci.

Publié : dim. 18/févr./2007 9:04
par Jacobus
Juste comme ça, j'ai l'impression qu'il y a des parenthèses en trop.
Essaye de cette façon :

Code : Tout sélectionner

If OpenLibrary(#lib, "plugins/"+DirectoryEntryName(#dossier)) 
          If GetFunction(#lib, "GetPluginName") ; si je mets "PurePlugin" çà ne marche pas non plus. 
            ;pwet ! 
          Else 
            MessageRequester("error","Ceci n'est pas un plugin") 
          EndIf

Publié : dim. 18/févr./2007 9:23
par comtois
Code utilisé pour créer la Dll

Code : Tout sélectionner

ProcedureDLL.l PurePlugin()
  ProcedureReturn 1
EndProcedure

ProcedureDLL.s GetPluginName()
  ProcedureReturn "Plugin One"
EndProcedure 
Code pour tester la Dll

Code : Tout sélectionner

#Lib=0
If OpenLibrary(#lib, "plugin.dll")
  Resultat = GetFunction(#lib, "GetPluginName") 
  If Resultat
    Debug PeekS(CallFunctionFast(Resultat))
  Else
    MessageRequester("error","Ceci n'est pas un plugin")
  EndIf 
EndIf  

Publié : dim. 18/févr./2007 9:45
par comtois
tu peux aussi utiliser les 'Prototype'

Code utilisé pour créer la Dll

Code : Tout sélectionner

ProcedureDLL.l PurePlugin(a.l,b.l)
  ProcedureReturn (a+b)
EndProcedure

ProcedureDLL.s GetPluginName(Texte.s)
  ProcedureReturn Texte + " Plugin One"
EndProcedure 
Code pour le test

Code : Tout sélectionner

;-- A placer dans un fichier include" ou utiliser Tailbite pour en faire une lib utilisateur

#Lib=0
Prototype GetPluginNameProc(Texte.s)
Prototype PurePluginProc(a.l,b.l)
Global GetPluginName.GetPluginNameProc
Global PurePlugin.PurePluginProc

Procedure InitPlugIn()
  If OpenLibrary(#lib, "plugin.dll")
    GetPluginName = GetFunction(#lib, "GetPluginName")
    PurePlugin = GetFunction(#lib, "PurePlugin")
    ProcedureReturn #True
  Else
    ProcedureReturn #False  
  EndIf 
EndProcedure

;-- Le programme débute ici"
;XincludeFile "PlugIn.pbi"

If InitPlugIn()
  Debug PeekS(GetPluginName("Bonjour"))
  Debug PurePlugin(3,9)
EndIf

Publié : dim. 18/févr./2007 19:23
par minirop
en mettant ProcedureDLL, çà marche.
merci Comtois (mais je ne le suis pas :lol: )