Chargement de DLL [Résolu]

Messages postés
243
Date d'inscription
lundi 30 octobre 2000
Statut
Membre
Dernière intervention
15 juillet 2013
- - Dernière réponse : Cirec
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
1 septembre 2019
- 8 mars 2008 à 13:48
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 ????
Afficher la suite 

8 réponses

Meilleure réponse
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
5
3
Merci
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;

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 212 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Guillemouze
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
10
3
Merci
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.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 212 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_rt15
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
5
0
Merci
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
Commenter la réponse de Guillemouze
Messages postés
243
Date d'inscription
lundi 30 octobre 2000
Statut
Membre
Dernière intervention
15 juillet 2013
0
Merci
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
Commenter la réponse de cs_barbichette
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
1 septembre 2019
33
0
Merci
 






@+
Cirec
Commenter la réponse de Cirec
Messages postés
243
Date d'inscription
lundi 30 octobre 2000
Statut
Membre
Dernière intervention
15 juillet 2013
0
Merci
Merci de ta participation Cirec...

Barbichette
Commenter la réponse de cs_barbichette
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
1 septembre 2019
33
0
Merci
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="" />
Commenter la réponse de Cirec
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
1 septembre 2019
33
0
Merci
Désolé,
j'ai eu un problème avec mon navigateur

 
@+
Cirec

<hr siz="" />
Commenter la réponse de Cirec