Page 1 sur 1

Discutions entre DLLs

Publié : mer. 23/févr./2005 1:17
par freddix
Salut @ tous,

J'aimerais pouvoir partager des données entre 2 DLLs.

J'explique.

J'aimerais par exemple utiliser la structure suivante :

Code : Tout sélectionner

Structure MyStructure
  Name.s : Value.l : Index.l
 EndStructure
Global WorkStructure.MyStructure
J'aimerais que mes 2 DLLs utilisent la même structure et les memes données contenues ( donc meme adresse mémoire )

Existe t-il un moyen d'envoyer le pointeur de la structure d'une DLL à l'autre et l'utiliser ?

Publié : mer. 23/févr./2005 1:24
par Fred
Il va falloir creer 2 fonctions (1 dans chaque DLL) pour passer cette structure en parametre. Par contre les strings ne sont modifiables que par la DLL qui l'a créé (mais ils sont consultables par n'importe quelle DLL).

Publié : mer. 23/févr./2005 11:42
par freddix
J'ai essayé de faire ceci :

[DLL : Reader.dll] Cette DLL reçoit la structure et essaye d'en lire les composants pour les afficher à l'écran.:

Code : Tout sélectionner

Structure MyStructure
  Name.s : Value.l
 EndStructure
Global *Test.MyStructure
ProcedureCDLL MyReadString( *Test )
  Value$ = Str( Test\Value )
  Final$ = Test\Name + " = " + Value$
  MessageRequester( "Here is the extracted text :" , Final$ )
 EndProcedure
[DLL : OpenReader.dll] Cette DLL ouvre la "Reader.dll" et lui envoie le pointeur de la structure à mettre en commun.

Code : Tout sélectionner

Global Pointer.s
Structure MyStructure
  Name.s : Value.l
 EndStructure
Global Test.MyStructure
ProcedureCDLL OpenReader()
  Test\Name = "Text to output"
  Test\Value = 1
  If OpenLibrary( 1 , "Reader.dll" )
    Myfunction.l = IsFunction( 1 , "MyReadString" )
    If MyFunction : CallCFunctionFast( MyFunction , *Test ) : EndIf
    CloseLibrary( 1 )
   EndIf
 EndProcedure
Mais j'obtiens Rien pour le string et 0 pour le nombre.

Publié : mer. 23/févr./2005 11:49
par Le Soldat Inconnu
Et tu as absolument besion des 2 dll ?
Tu ne peux pas les regrouper ?

Publié : mer. 23/févr./2005 13:12
par freddix
non
justement
j'en ai meme plus que 2 :(
C'est pour utiliser des données globales entre plusieurs DLLs ...

Publié : mer. 23/févr./2005 14:28
par Fred
Essaie ca pour le code du reader:

Code : Tout sélectionner

Structure MyStructure
  Name.s : Value.l
 EndStructure

ProcedureCDLL MyReadString( *Test.MyStructure)
  Value$ = Str( *Test\Value )
  Final$ = *Test\Name + " = " + Value$
  MessageRequester( "Here is the extracted text :" , Final$ )
 EndProcedure

Publié : mer. 23/févr./2005 18:21
par nico
Tu peux utiliser la mémoire partagée, tu auras un accès direct aux données sans faire appel aux dll pour lire les variables à l'instant donné.

Regarde dans trucs et astuces ici:
http://purebasic.hmt-forum.com/viewtopic.php?t=716

Publié : mer. 23/févr./2005 19:05
par freddix
@Fred : Ca fait carément planter le prog :(

Publié : mer. 23/févr./2005 19:50
par comtois
bizarre , tel quel ça fonctionne ( avec la 3.93 beta 2)

Code : Tout sélectionner

Structure MyStructure
  Name.s : Value.l
EndStructure

Test.MyStructure
Test\Name="Text to output"
Test\Value=1

ProcedureCDLL MyReadString( *Test.MyStructure)
  Value$ = Str( *Test\Value )
  Final$ = *Test\Name + " = " + Value$
  MessageRequester( "Here is the extracted text :" , Final$ )
EndProcedure 

MyReadString(@Test)

Publié : mer. 23/févr./2005 19:53
par Oliv
Tu dois bien avoir un programme qui lance ces DLL non ? :)
Donc ce n'est pas possible d'allouer une zone mémoire avec allocate memory() dans ce programme et de donner l'adresse à tes DLL, comme ça elles pouront l'utiliser à volonté avec le commandes pure non ?(je dis peut-être une grosse bétise mais bon) :oops:

Publié : mer. 23/févr./2005 20:36
par cederavic
Code de Reader.DLL

Code : Tout sélectionner

Structure MyStructure
  Name.s : Value.l
EndStructure

ProcedureCDLL MyReadString(*Pt.MyStructure)
  Value$ = Str( *Pt\Value )
  Final$ = *Pt\Name + " = " + Value$
  MessageRequester( "Here is the extracted text :" , Final$ )
EndProcedure 
Code de OpenReader.DLL

Code : Tout sélectionner

Structure MyStructure
  Name.s : Value.l
EndStructure

Global Test.MyStructure

ProcedureCDLL OpenReader()
  Test\Name = "Text to output"
  Test\Value = 1
  If OpenLibrary( 1 , "reader.dll" )
    *Myfunction.l = IsFunction( 1 , "MyReadString" )
    If *Myfunction : CallCFunctionFast( *Myfunction , @Test ) : EndIf
    CloseLibrary( 1 )
  EndIf
EndProcedure
Voilou :)

besoin d'explication sur tes erreurs?

Publié : mer. 23/févr./2005 23:29
par freddix
Maintenant se pose un petit soucis, il faut que dans la DLL Reader.dll, la structure soit globale :( ... Comment faire ?

Publié : mer. 23/févr./2005 23:45
par cederavic
Code de Reader.DLL

Code : Tout sélectionner

Structure MyStructure
  Name.s : Value.l
EndStructure

Global *MyTruc.MyStructure

ProcedureCDLL InitMyTruc(*Pt.MyStructure)
  *MyTruc = *Pt
EndProcedure 

ProcedureCDLL ReadName()
  MessageRequester( "Name = " , *MyTruc\Name, 0)
EndProcedure

ProcedureCDLL ReadValue()
  MessageRequester( "Value = " , Str(*MyTruc\Value), 0)
EndProcedure
Code de OpenReader.DLL

Code : Tout sélectionner

Structure MyStructure
  Name.s : Value.l
EndStructure

Global Test.MyStructure

ProcedureCDLL OpenReader()
  Test\Name = "Machin truc bidule chouette"
  Test\Value = 1
  If OpenLibrary( 1 , "reader.dll" )
    *InitMyTruc = IsFunction( 1 , "InitMyTruc" )
    *ReadName = IsFunction( 1 , "ReadName" )
    *ReadValue = IsFunction( 1 , "ReadValue" )
    If *InitMyTruc: CallCFunctionFast( *InitMyTruc , @Test ) : EndIf
    If *ReadName: CallCFunctionFast( *ReadName) : EndIf
    If *ReadValue: CallCFunctionFast( *ReadValue) : EndIf
    Test\Name = "changé!"
    Test\Value = 12
    If *ReadName: CallCFunctionFast( *ReadName) : EndIf
    If *ReadValue: CallCFunctionFast( *ReadValue) : EndIf
    CloseLibrary( 1 )
  EndIf
EndProcedure
Si j'ai bien compris ce que tu m'as dit sur MSN, ceci devrait te satisfaire, sinon... ben... j'ai rien capter :lol: