Sujets variés concernant le développement en PureBasic
freddix
Messages : 101 Inscription : dim. 08/févr./2004 19:37
Message
par freddix » mer. 23/févr./2005 1:17
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 ?
Dernière modification par
freddix le mer. 23/févr./2005 11:20, modifié 1 fois.
Fred
Site Admin
Messages : 2808 Inscription : mer. 21/janv./2004 11:03
Message
par Fred » mer. 23/févr./2005 1:24
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).
freddix
Messages : 101 Inscription : dim. 08/févr./2004 19:37
Message
par freddix » mer. 23/févr./2005 11:42
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.
Le Soldat Inconnu
Messages : 4312 Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :
Message
par Le Soldat Inconnu » mer. 23/févr./2005 11:49
Et tu as absolument besion des 2 dll ?
Tu ne peux pas les regrouper ?
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64) ]
freddix
Messages : 101 Inscription : dim. 08/févr./2004 19:37
Message
par freddix » mer. 23/févr./2005 13:12
non
justement
j'en ai meme plus que 2
C'est pour utiliser des données globales entre plusieurs DLLs ...
Fred
Site Admin
Messages : 2808 Inscription : mer. 21/janv./2004 11:03
Message
par Fred » mer. 23/févr./2005 14:28
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
freddix
Messages : 101 Inscription : dim. 08/févr./2004 19:37
Message
par freddix » mer. 23/févr./2005 19:05
@Fred : Ca fait carément planter le prog
comtois
Messages : 5186 Inscription : mer. 21/janv./2004 17:48
Contact :
Message
par comtois » mer. 23/févr./2005 19:50
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)
Oliv
Messages : 2117 Inscription : mer. 21/janv./2004 18:39
Message
par Oliv » mer. 23/févr./2005 19:53
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)
cederavic
Messages : 1338 Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux
Message
par cederavic » mer. 23/févr./2005 20:36
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?
freddix
Messages : 101 Inscription : dim. 08/févr./2004 19:37
Message
par freddix » mer. 23/févr./2005 23:29
Maintenant se pose un petit soucis, il faut que dans la DLL Reader.dll, la structure soit globale
... Comment faire ?
cederavic
Messages : 1338 Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux
Message
par cederavic » mer. 23/févr./2005 23:45
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