Creation de plugin

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Creation de plugin

Message par Thyphoon »

Bonjour,

Dans le cadre d'une application, j'essaye d'intégrer des plugins. jusque là ça vas je fabrique un DLL pour chaque plugin. que j'ouvre avec mon programme principal.
là ou je coince c'est que j'ai besoin dans se plugin d'utiliser des lists, des variables, et des fonctions du programme principal et c'est là ou je coince. Comment faire cela ?
Au départ je pensais faire un tableau qui contiendrait les adresses des lists, variable et procédure du programme principal et que je passerais en argument des procédures du plugin.
Qu'en pensez vous ? comment procéderiez vous ?


ex :Donnée du programme principal a utilisé dans le plugin (les données c'est pour l'exemple, elle ne représente rien de concret)

Code : Tout sélectionner

Structure mylist
vara.s
varb.l
varc.b
endstructure

Global newlist mylist.mylist()
Global dim mytable.mylist(#tbl_end)
Global Nbimage.l

Procedure MySort(*tab)
endprocedure

code du plugin utilisant les données du programme principal

Code : Tout sélectionner

ProcedureDLL.l Action()
;code que j'aurais fait si c'était une fonction normal du programme principal et non un plugin...
selectelement(mylist(),1)
mutable(1)\vara="coucou"
Nbimage+1
endprocedure
Endproceduredll
comment devrais-je formuler ça dans le plugin ?
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Merci Dobro mais j'avais déjà trouvé tout ça. helas aucun ne parle comment utilisé une procedure du programme principal etC...
Mais merci de t'être penché dessus :P
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

voici l'idée un peu mieux exprimé mais ça ne marche pas...

le code du programme principal:

Code : Tout sélectionner

Structure MyList
vara.s
varb.l
EndStructure

Global NewList Mylist.MyList()

Global Dim Mytable.MyList(1000)

Procedure MyProcedure(txt.s)
EndProcedure

;Initiation des variables de liaison avec le plugin
Enumeration
#Lk_MyProcedure
#Lk_Mytable
#Lk_Mylist
#Lk_End
EndEnumeration

Global Dim *LinktoMain(#Lk_End)
*LinktoMain(#Lk_MyProcedure)=@MyProcedure()
*LinktoMain(#Lk_Mytable)=@Mytable()
*LinktoMain(#Lk_Mylist)=@Mylist
  If OpenLibrary(0, "plugin.dll")
    CallFunction(0, "Action",LinktoMain() )
    CloseLibrary(0)
  EndIf
le code du plugin a compiler en tant que dll sous le nom de plugin.dll

Code : Tout sélectionner

Structure MyList
vara.s
varb.l
EndStructure

;Initiation des variables de liaison avec le plugin
Enumeration
#Lk_MyProcedure
#Lk_Mytable
#Lk_Mylist
#Lk_End
EndEnumeration


ProcedureDLL.l Action(*LinktoMain())
ResetList(*LinktoMain(#Lk_Mylist))

;selectelement(mylist(),1)
;mutable(1)\vara="coucou"
;Nbimage+1
EndProcedure
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

pour ce genre de bidouille tu peux le mettre en hard dans le prg principale !!

et utiliser le plugins pour activer cette fonctionalité !!

exemple

lorsque le plugin recoit la commande "action"
il renvoi un chiffre precis (ici "1")

ce qui va indique au prg principal la marche a suivre
(voir le if en fin de prg principale !! :D)
bon c'est encore une ruse de guerre , mais cela evite bien des soucis :D

ex DLL "plugin.dll"

Code : Tout sélectionner

Structure MyList
    vara.s
    varb.l
EndStructure

;Initiation des variables de liaison avec le plugin
Enumeration
    #Lk_MyProcedure
    #Lk_Mytable
    #Lk_Mylist
    #Lk_End
EndEnumeration


ProcedureDLL.l Action() 
    ;selectelement(mylist(),1)
    ;mutable(1)\vara="coucou"
    ;Nbimage+1
    ProcedureReturn 1 ; <--------- ici le chiffre magic !!
EndProcedure


ex: prg principal

Code : Tout sélectionner

Structure MyList
    vara.s
    varb.l
EndStructure

Global NewList Mylist.MyList()

Global Dim Mytable.MyList(1000)

Procedure MyProcedure(txt.s)
EndProcedure

;Initiation des variables de liaison avec le plugin
Enumeration
    #Lk_MyProcedure
    #Lk_Mytable
    #Lk_Mylist
    #Lk_End
EndEnumeration

Global Dim LinktoMain(#Lk_End)
LinktoMain(#Lk_MyProcedure)=@MyProcedure()
LinktoMain(#Lk_Mytable)=@Mytable()
LinktoMain(#Lk_Mylist)=@Mylist
If OpenLibrary(0, "plugin.dll")
    retour=CallFunction(0, "Action")
    CloseLibrary(0)
EndIf


If  retour=1 ; <------ le chiffre magic est demandé par le plugin !!!
    CallDebugger
    ; un arret ici prouve que la dll fonctionne <------**************
    ResetList( Mylist()) ; on execute l'action demandé !!
EndIf
de cette façon , les liste tableau et compagnie reste la proprieté
du prg principale !!

les plugins peuvent activer tel ou tel fonctionnalité du prg principal
par "télécommande" !! :D


les plugins peuvent aussi effectuer des actions, autre, du moment
que cela ne touche pas aux tableau,list, du prg principal (sauf par telecomande)
voila , c'est une astuce qui évite bien des soucis non ? :D
pourquoi chercher a faire complique losqu'on peut faire simple :D
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Dobro a écrit :pour ce genre de bidouille tu peux le mettre en hard dans le prg principale !!

et utiliser le plugins pour activer cette fonctionalité !!
mmm oui mais alors il n'y a plus aucun intérêt a faire un plugin alors...
là c'est pour l'exemple mais j'ai besoin d'acceder a des listes du programme principal qui vont donner des references au plugin avant que ce dernier ne change certaine information dans des tableaux et des lists...
Dobro a écrit : les plugins peuvent activer tel ou tel fonctionnalité du prg principal
par "télécommande" !! :D
Lollllllll donc il n'y a plus aucun intérêt des plugins si tout est intégré dans code principal...
Dobro a écrit : les plugins peuvent aussi effectuer des actions, autre, du moment
que cela ne touche pas aux tableau,list, du prg principal (sauf par telecomande)
voila , c'est une astuce qui évite bien des soucis non ? :D
pourquoi chercher a faire complique losqu'on peut faire simple :D
Ba je cherche pas a compliquer, c'est un besoin dans mon cas que le plugin puisse touché a des informations interne.

Si tu as une autre idée elle est la bienvenu lollllll :wink:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

bah ! je sais pas faire ! :? :lol:
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Dobro a écrit :bah ! je sais pas faire ! :? :lol:
pas grave merci de t'être penché sur mon problème. Peut être que quelqu'un aura une idée... je continue de chercher pour l'instant
Anonyme

Message par Anonyme »

c'est relativement simple en fait, dans ton programme principal
tu créer des procédures qui renvois l'adresse des listes, tableaux, procedure, structures,etc... cela n'est vraiment pas compliqué, je dis cela car je l'ai fait pour un vieux prog de langage interprété ou je pouvais codé des plugins
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Cpl.Bator a écrit :c'est relativement simple en fait, dans ton programme principal
tu créer des procédures qui renvois l'adresse des listes, tableaux, procedure, structures,etc... cela n'est vraiment pas compliqué, je dis cela car je l'ai fait pour un vieux prog de langage interprété ou je pouvais codé des plugins
Et comment tu appels les procédures qui te renvois les adresse des listes a partir du plugin ? si tu as un petit exemple...même si pas complet je suis preneur ! :P
Anonyme

Message par Anonyme »

Tu ne l'appelle pas, mais ton plugin doit avoir une procedure ( du meme nom pour tout les plugins ) comme cela ton programme principal charge la .dll ou le .so , une fois chargé le programme principale appel la fonction du nom que tu as choisi du genre "PlugInit()" , si l'appel echoue , alors ce n'est pas un plugin.
et tu profite de l'appel pour passé en paramètre des adresses & cie...

Donc , au niveau du prog principal :

- Charge les dll ou so stocké dans un dossier ( ex : ./Plugins )
- A chaque chargement appel de la procédure d'initialisation du plugin ( commune a tout les plugins )
- si l'appel echoue, alors ce n'est pas un plugin
- profite de l'appel pour passé des adresse en paramètre & cie...

++
Répondre