Page 1 sur 1
Procedure exterrieur a une DLL
Publié : mer. 14/sept./2005 19:59
par Thyphoon
Salut à tous !!
Je voudrais faire une application utilisant un système de plugin (DLL)
et j'aurais voulu que les procedures de la DLL utilise des procedures qui sont dans le programme principal
Exemple :
main.exe
Code : Tout sélectionner
procedure affiche(x,y)
endprocedure
chargement du plugin utilisé
plugin_wini()
Plugin.dll
est ce que c'est possible et est ce qu'une variable déclaré global dans main.exe pourra être récupéré dans la procedure du plugin ?
Chez moi les quelques essais on été négatif ... j'ai peut être fait des erreurs mais avant de chercher durant des heures (j'ai déjà du mal a trouver du temps pour programmer alors j'essaye de pas trop perdre de temps) je voulais juste savoir si c'était bien réalisable... et si mon principe est bon !
merci d'avance

Publié : jeu. 15/sept./2005 6:17
par cederavic
Hello,
C'est tout a fait possible, il suffit d'envoier l'adresse de la proc a la dll, et dans la proc, retourner l'adresse de la variable...
Exemple :
Code : Tout sélectionner
;main.pb
Global nb.l
Procedure test2(text.s)
MessageRequester("test2", text, 0)
ProcedureReturn @nb
EndProcedure
test2("main call")
nb = Random(255)
MessageRequester("main", "set nb = " + Str(nb), 0)
OpenLibrary(0, "dll.dll")
CallFunction(0, "test", @test2())
MessageRequester("main", "verif dll set nb = " + Str(nb), 0)
Code : Tout sélectionner
;dll.pb
ProcedureDLL AttachProcess(Instance)
EndProcedure
ProcedureDLL DetachProcess(Instance)
EndProcedure
ProcedureDLL AttachThread(Instance)
EndProcedure
ProcedureDLL DetachThread(Instance)
EndProcedure
ProcedureDLL test(*proc.l)
*nb = CallFunctionFast(*proc, "dll call")
MessageRequester("dll", "verif main set nb = " + Str(PeekL(*nb)), 0)
PokeL(*nb, Random(255))
MessageRequester("dll", "set nb = " + Str(PeekL(*nb)), 0)
EndProcedure
Apres si tu veux modifier plusieurs variables globales de main.pb dans dll.pb, soit tu retourne l'adresse d'un dim cotenant les adresse des variables concernées, soit tu utilise la lib GlobalSharedMemory que tu trouveras sur PureArea.net.
Byebye!
Publié : jeu. 15/sept./2005 6:28
par Thyphoon
Merci cederavic

J'ai tout ce que je voulais savoir et même plus ...
c'est génial

Publié : jeu. 15/sept./2005 18:32
par cederavic
Pas de quoi

Publié : jeu. 15/sept./2005 20:56
par Thyphoon
J'ai essayé de m'inspirer de ton exemple ...mais j'ai du mal
je voudrais pouvoir remplir une list chainé en utilisant une librairie externe ... voilà ce que j'ai essayé de faire
Main.exe
Code : Tout sélectionner
Structure MenuStructure
Name.s
Option.s
Sel.s
EndStructure
NewList Menu.MenuStructure()
Resultat = OpenLibrary(0, "plugin.dll")
Debug CallFunction(0, "PluginDefaultGamePref",*Menu())
plugin.dll
Code : Tout sélectionner
ProcedureDLL PluginDefaultGamePref(menu)
Menu()=@menu
Restore Menu
For z=0 To 1000
Read Menu()/Name
Read Menu()/Option
Read Menu()/Sel
Next
EndProcedure
DataSection
Menu:
Data.s "Windows video options","",""
Data.s "autoframeskip","0|1",""
Data.s "frameskip","0|1","No|Yes"
etc...
est ce quelqu'un peu m'aider ?
Publié : ven. 16/sept./2005 20:55
par Thyphoon
Haaaaaaaarg je vais me tirer une balle ....là je comprends plus qu'est ce qui cloche
main.exe
Code : Tout sélectionner
Structure MenuStructure
Name.s
Option.s
Display.s
Sel.l
EndStructure
NewList Menu.MenuStructure()
Procedure Add_Menu_Element()
;AddElement(Menu())
;Menu()\Name = name
;Menu()\Option = option
;Menu()\Display = display
;Menu()\Sel = sel
;ProcedureReturn 0
EndProcedure
;For z=0 To 100
; AddElement(Menu())
; Menu()\Name = "coucou"+Str(z)
; Menu()\Option = "YES|NO|GO"
;Next
Resultat = OpenLibrary(0, "plugin.dll")
Debug CallFunction(0, "PluginDefaultGamePref",@Add_Menu_Element())
plugin.dll
Code : Tout sélectionner
ProcedureDLL PluginDefaultGamePref(*proc.l)
Restore Config_Default
While name.s<>"Menu_End"
Read name.s
Read option.s
Read display.s
CallFunctionFast(*proc, "AddMenuElement",name,option,display,sel)
Wend
ProcedureReturn 0
EndProcedure
DataSection
Config_Default:
Data.s "Windows video options","",""
Data.s "autoframeskip","0|1",""
Data.s "frameskip","0|1","No|Yes"
Data.s "waitvsync","0|1",""
Data.s "triplebuffer","0|1",""
Data.s "ddraw","0|1",""
Data.s "Menu_End","Menu_End","Menu_End"
EndDataSection
et là ça plante a la compilation de main.exe
(ERROR)Illegal instruction. (executing binary data?)
quelqu'un voit le problème ?
Publié : ven. 16/sept./2005 21:12
par nico
Code : Tout sélectionner
; Tu fais une confusion entre appeler une fonction depuis une Dll
; et appeler une fonction depuis un même programme.
;/ main
Procedure Add_Menu_Element(Name.s,option.l,display.l,sel.l)
;AddElement(Menu())
;Menu()\Name = name
;Menu()\Option = option
;Menu()\Display = display
;Menu()\Sel = sel
;ProcedureReturn 0
EndProcedure
;/Plugin.dll
Procedure
; ....
CallFunctionFast(*proc,Name,option,display,sel)
;.....
EndProcedure
Publié : ven. 16/sept./2005 21:20
par Thyphoon
Nico ! un grand merci
Enfin ça fonctionne ... bon je sais pas trop comment te remercier ainsi que tout ceux qui m'on aider. Mais en tout cas merci... Et en plus c'est bon j'ai compris mes erreurs. J'éspère moins vous embeter maintenant
Et merci de votre patience...
