Discutions entre DLLs

Sujets variés concernant le développement en PureBasic
freddix
Messages : 101
Inscription : dim. 08/févr./2004 19:37

Discutions entre DLLs

Message 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 ?
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 »

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 »

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 »

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 »

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 »

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

Message 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
freddix
Messages : 101
Inscription : dim. 08/févr./2004 19:37

Message par freddix »

@Fred : Ca fait carément planter le prog :(
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message 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)
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message 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:
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message 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?
freddix
Messages : 101
Inscription : dim. 08/févr./2004 19:37

Message par freddix »

Maintenant se pose un petit soucis, il faut que dans la DLL Reader.dll, la structure soit globale :( ... Comment faire ?
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message 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:
Répondre