Page 1 sur 1
Un petit doute sur les pointeurs et les DLL
Publié : lun. 12/mai/2008 15:11
par ker2x
Bonjour,
Si je me trompe pas, l'application et la DLL partage le meme espace memoire ?
Si je crée un espace memoire avec AllocateMemory(*Buffer), dans le code de l'application, ou dans le code de la DLL, cet espace memoire sera accessible via une ProcedureDLL ou via une procedure dans l'application principale (a condition de connaitre le pointeur et la taille) ?
Un truc qui m'echappe par contre... Une DLL n'est chargée qu'une seule fois.
Si j'ai 2 applications qui accedent a la même DLL, ces 2 application vont elle partager le meme espace memoire ? Ca me parrait debile... alors je me dit que j'ai raté un truc.
Et si je crée une variable globale (horreur!) dans la DLL et que le contenu de cette variable est modifiée... Elle sera modifié pour toutes les application utilisant la DLL ? La aussi ca me parrait... bizzare

Publié : lun. 12/mai/2008 16:02
par Xpetera
"
Et si je crée une variable globale (horreur!) dans la DLL et que le contenu de cette variable est modifiée... Elle sera modifié pour toutes les application utilisant la DLL ? La aussi ca me parrait... bizzare Smile "
même si j'y connait rien en DLL buffers etc enfin tout ce qui touche à la mémoire , je pense peut être que l'application charge la dll au départ et que si un contenu de cette DLL est changé je ne pense pas que cela s'applique sur toutes les applications vu qu'elles l'auraient chargée au départ
Publié : lun. 12/mai/2008 16:22
par ker2x
Autrement dit :
- la partie "code" n'est chargé qu'une seule fois en memoire
- la partie "data" est alloué specifiquement a chaque application utilisant la DLL. (et autant de fois qu'il y a d'application utilisant la DLL)
J'ai bon ?
Publié : lun. 12/mai/2008 16:26
par nico
La DLL sera chargée dans chacun des espaces mémoires des processus, si tu veux partager un même espace mèmoire, tu peux utiliser un fichier mappé:
http://purebasic.fr/french/viewtopic.php?t=716
Publié : lun. 12/mai/2008 16:54
par ker2x
Haa interessant, merci pour le lien, ca servira

Publié : lun. 12/mai/2008 20:42
par ker2x
Ah tiens, j'ai encore une question
J'ai besoin de declarer une structure dans ma DLL.
Une de mes procedure retournera un pointeur vers cette structure.
Y'a til un moyen de faire connaitre la ... structure de la structure a l'application ? Ou il faut que je la redeclare (de la meme facon

) dans l'application ?
Publié : lun. 12/mai/2008 21:29
par nico
Il faut déclarer la structure deux fois.
Publié : lun. 12/mai/2008 21:58
par Chris
C'est la même chose que quand tu utilises une dll de Microsoft.
La structure est déjà déclarée dans la dll, mais tu la déclares aussi dans ton programme.
Publié : lun. 12/mai/2008 22:34
par ker2x
ok

Publié : lun. 12/mai/2008 23:16
par Anonyme
c'est la base , c'est deux structures sont exactement les même une fois compilé :
Code : Tout sélectionner
structure A
a.l
b.l
c.l
d.l
endstructure
structure Pareilque_A
Pareilque_a.l
Pareilque_b.l
Pareilque_c.l
Pareilque_d.l
endstructure
c'est juste la syntaxe qui change dans le code source. la structure fait toujours 16 bytes en mémoire.
Et si je crée une variable globale (horreur!) dans la DLL et que le contenu de cette variable est modifiée
Admettons que tu code une dll perso avec une variable globale TOTO
et que dans un exe tu déclares TOTO aussi , et que tu modifie cette variable , la variable TOTO au seins de la dll ne sera pas touché , car une fois compilé elle ne s'appelle pas TOTO, c'est une simple adresse mémoire.
@++
Publié : mar. 13/mai/2008 0:02
par ker2x
Cpl.Bator a écrit :
Admettons que tu code une dll perso avec une variable globale TOTO
et que dans un exe tu déclares TOTO aussi , et que tu modifie cette variable , la variable TOTO au seins de la dll ne sera pas touché , car une fois compilé elle ne s'appelle pas TOTO, c'est une simple adresse mémoire.
@++
Sauf que tu peux importer une variable.
Exemple :
Import "toto.lib"
MaVariable.<type> [as "NomSymbole"]
EndImport
Ce qui me laisse penser que, pour une variable importée, si elle est modifiée dans la DLL, elle est modifiée dans l'appli, et vice versa, car l'espace memoire de cette variable est partagé quand on l'importe.
Enfin, c'est ce que j'ai compris, c'est la question que je me pose.
Je crois que le plus simple c'est encore d'essayer... Mais d'abord : dodo

Publié : mar. 13/mai/2008 14:39
par Anonyme
tu importes des fonctions , mais pas des variable, relis mon post.
les variables ne sont pas exporté.
pour modifier une variable au seins d'une dll , il te faut son adresse.
fait des tests , tu verras bien.
@++