Procedure exterrieur a une DLL

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 :

Procedure exterrieur a une DLL

Message 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

Code : Tout sélectionner

proceduredll plugin_winin()
 affiche(x,y)
endprocedure
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 :P
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message 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!
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Merci cederavic :D J'ai tout ce que je voulais savoir et même plus ...
c'est génial :D
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message par cederavic »

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

Message 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 ?
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message 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 ?
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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  
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Nico ! un grand merci :D
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 :P

Et merci de votre patience...
:lol:
Répondre