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)

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
