Chargement de DLL [Résolu]

Signaler
Messages postés
243
Date d'inscription
lundi 30 octobre 2000
Statut
Membre
Dernière intervention
15 juillet 2013
-
Messages postés
3811
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
15 juin 2020
-
Salut,

J'ai un petit souci. Je ne sais pas si c'est possible de faire marcher ceci :
- J'ai une DLL qui charge le contenu d'un fichier dans un tableau [0..255]of byte;
- dans mon application, j'appel une première fois loadlibrary puis GetProcAdress pour lier à la fonction de chargement
- Je lance le chargement d'un fichier
- dans mon application, j'appel une deuxième fois loadlibrary puis GetProcAdress
- Je relance le chargement d'un deuxième fichier


Et là... il écrase le contenu en mémoire du premier appel...

Alors que je voudrai "2 instances" de la dll avec le contenu des deux fichiers dans chaque instance.
Puis pouvoir interroger aussi bien la première sur son contenu ou la deuxième avec son propre contenu.

Est-ce possible de charger 2 fois une Dll mais à deux endroits différent de la mémoire ????

8 réponses

Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
5
je pense pas que ce soit possible, essaye ca, tu vera le resultat :

procedure TForm1.Button1Click(Sender: TObject);
var
  h1, h2: thandle;
  p1, p2: pointer;
begin
  h1 := LoadLibrary('kernel32');
  h2 := LoadLibrary('kernel32');
  p1 := GetProcAddress(h1, 'GetVersion');
  p2 := GetProcAddress(h2, 'GetVersion');
  showmessage('meme handle : '+BoolToStr(p1=p2, true));
  showmessage('meme proc : '+BoolToStr(p1=p2, true));
end;
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
11
Salut,

Tu peux aussi faire des allocations dynamique du tableau dans la dll.
Mais il faudra libérer les tableaux dans la dll, Sauf si tu utilises ShareMem, mais c'est pas franchement conseillé. Ca doit pouvoir se faire dans le finalize, ou en interceptant le PROCESS_DETACH.

On ne peut pas facilement charger deux fois une même dll. Peut être avec MapAndLoad.
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
5
je suis pas sur que tu puisse varger 2 fois ta dll, mais par contre tu peux passer ton buffer a ta dll.
je m'explique :

procedure MaProcDansLaDll(Buffer: array[0..255]of byte; fichier: string);
begin
    //remplissgae du buffer depuis le fichier
end;

ainsi, tu met tes 2 buffer en variable dans ton exe, et pour chaque appel de ta dll, tu passe un buffer different
Messages postés
243
Date d'inscription
lundi 30 octobre 2000
Statut
Membre
Dernière intervention
15 juillet 2013

Effectivement, je vais peut-être faire ça...
D'autant que j'accède à ma DLL via une class TObject.
Donc, 2 classes, deux tableaux.
C'est tout bête, mais y'avais pas pensé....

J'attend quand même pour voir si il y a une autre possibilité directement par la DLL...
Merci
Messages postés
3811
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
15 juin 2020
30
 






@+
Cirec
Messages postés
243
Date d'inscription
lundi 30 octobre 2000
Statut
Membre
Dernière intervention
15 juillet 2013

Merci de ta participation Cirec...

Barbichette
Messages postés
3811
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
15 juin 2020
30
Salut,

que de complications ....

Il suffit de creer un Objet dans la DLL qui se charge de tout
Une unité avec les déclarations de l'objet qui se trouve dans la DLL (pour y accéder depuis l'application) et voilà le tour est joué ...
ça fonctionne très bien, l'accès est rapide (pour un Array[0..255] Of Byte)
et aucun problème d'accès, libération ou fuites de mémoire

Et donc en créant deux objet dans l'application on a acces au deux tableaux que l'on peut modifier et/ou consulter à souhait

 
@+
Cirec

<hr siz="" />
Messages postés
3811
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
15 juin 2020
30
Désolé,
j'ai eu un problème avec mon navigateur

 
@+
Cirec

<hr siz="" />