[C++] Gestion DLL

Fermé
kzanadeus Messages postés 70 Date d'inscription lundi 3 décembre 2007 Statut Membre Dernière intervention 4 décembre 2009 - 2 juin 2008 à 12:01
juanpablo Messages postés 142 Date d'inscription mercredi 30 mai 2007 Statut Membre Dernière intervention 16 juin 2008 - 6 juin 2008 à 14:10
Bonjour,

je suis en train de programmer une DLL. Le problème que je rencontre est que j'aimerais que lorsqu'un éxécutable monte en mémoire ma DLL, elle ne soit pas dépendante de l'éxécutable et donc qu'à partir d'une seul DLL en mémoire on puisse y accéder à aprtir de plusieurs éxécutables. Ainsi avec un seul hadle sur la DLL je peux accéder à partir de n'importe quel éxécutable à toutes les fonctions de la DLL.

Cordialement.

Kzanadeus.
A voir également:

9 réponses

kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
2 juin 2008 à 13:20
Salut,

Tu auras besoin de LoadLibrary pour charger dynamiquement cette DLL:
https://docs.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-loadlibrarya?redirectedfrom=MSDN

Tu vas récupérer un HMODULE (handle sur module) que tu pourras utiliser avec GetProcAddress afin de chercher l'adresse d'une fonction.
https://docs.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-getprocaddress?redirectedfrom=MSDN

Voilà :-)
0
kzanadeus Messages postés 70 Date d'inscription lundi 3 décembre 2007 Statut Membre Dernière intervention 4 décembre 2009 3
2 juin 2008 à 13:32
Tout d'abord, merci de m'avoir répondu.

Je crain de m'être mal fait comprendre.

En fait je fais un LoadLibrary dans un .exe puis un GetProcAdresse, le HMODULE et le résultat du getProcAdresse sont placé en mémoire partagée et dans mon autre .exe lorsque je récupère le HMODULE directement à partir de la zone mémoire et que je fais un GetProcAdress avec j'obtient l'érreur 0x000000b7 (ERROR_ALREADY_EXISTS) donc j'ai décidé de récupérer directement le pointeur sur la fonction que j'obtient grâce au premiere .exe et lorsque je fais appel à la fonction ben il ne se passe rien, c'est comme si elle ne se terminait jamais...

Cordialement.

Kzanadeus.
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
2 juin 2008 à 19:39
Chaque processus possède son espace de mémoire virtuelle.
Si un processus A fait un LoadLibrary de kernel32.dll et fait un getprocaddress sur MessageBox, le processus A aura donc l'adress de MessageBox sur son propre espace virtuel, car kerne32.dll sera mappé dans l'espace virtuel de A. S'il refile cette adresse à B, il faut voir 2 choses:
* B n'a pas chargé kernel32.dll donc l'image de cette dll n'est pas dans son espace mémoire.
* B peut charger kerne32.dll en mémoire, il ne sera pas forcément mappé aux mêmes adresses dans A et dans B. Donc un getprocaddress fait dans A retournera une adresse qui peut être fausse pour B.

De même un HANDLE ouvert par A et qui n'a pas été ouvert par B ne peut pas être utilisé par B.
0
kzanadeus Messages postés 70 Date d'inscription lundi 3 décembre 2007 Statut Membre Dernière intervention 4 décembre 2009 3
3 juin 2008 à 08:51
Merci pour la réponse.

Je suis donc très triste...

Il n'y a pas un moyen de faire en sorte que la DLL se monte en mémoire partagé?

Cordialement.

Kzanadeus.
0
kzanadeus Messages postés 70 Date d'inscription lundi 3 décembre 2007 Statut Membre Dernière intervention 4 décembre 2009 3
3 juin 2008 à 11:13
Pour vous aiguiller un peu plus c'est pour la création d'un CSP. Ce CSP est une dll qui va en appeller une autre qui va faire le travail. En effet, notre CSP ne fait pas le travail car il nécessite une installation sur le poste et donc des droits spéciaux (Administrateur du poste) et nous ne voulons pas devoir refaire cette installation à chaque fois que nous ferons une nouvelle version. Ainsi il nous suffit de garder ce CSP "vierge" qui appelle une DLL placé quelque part sans nécessitant de droits spéciaux et donc à la fin de l'utilisation du CSP nous supprimons cette DLL. En cas de nouvelle version, c'est cette DLL qui est modifiée et placée au même endroit que d'ordinaire et l'utilsiation reste le même sauf que les capacités de la DLL changent. Cette deuxième DLL doit être démontée de la mémoire une fois le travail accomplie sans que le CSP ne soit forcement relaché par une instance d'Internet Explorer. Puisque si IE n'est pas fermé alors le CSP reste en mémoire donc il ne laisse pas la DLL non plus et donc elle ne peut pas être supprimée.

Donc nous voudrions qu'une deuxième application puisse accéder à certaines fonctions de notre CSP, celui lancé par IE afin de forcer le relachement de la DLL.

Mais si lorsque notre application monte le CSP en mémoire, il n'a pas accès aux fonctions de l'instance créée par IE alors même si on demande à notre CSP de lacher la DLL, l'instance créée par IE ne la laissera pas donc, on ne pourra supprimer notre DLL.

De plus si on lance deux IE différents et que l'on accede à notre CSP on aura plusieurs instances de notre CSP et donc il sera très difficile de faire en sorte que chaque instance du CSP lache son Handle sur notre DLL...

Si vous avez besoin d'informations complémentaires, je reste à votre dispoition et vous remerci encore énormement pour les informations et réponses que vous m'apportez.

Cordialement.

Kzanadeus.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
4 juin 2008 à 14:48
Ben en fait c'est un peu compliqué à comprendre :-o, j'arrive pas là...
0
kzanadeus Messages postés 70 Date d'inscription lundi 3 décembre 2007 Statut Membre Dernière intervention 4 décembre 2009 3
4 juin 2008 à 14:49
C'est pas grave nous allons changer de voie afin de remédier a notre problème.

Merci pour le temps passé.

Cordialement.

Kzanadeus.
0
kzanadeus Messages postés 70 Date d'inscription lundi 3 décembre 2007 Statut Membre Dernière intervention 4 décembre 2009 3
5 juin 2008 à 15:12
J'ai réussi à contourner le problème mais ce n'est pas terrible je suis obligé de passer par des variables globales au systeme.

Par contre j'ai des problèmes avec mon CSP et mon navigateur (IE) lorsque je fais la fonction CryptSignHash je n'ai aps d'erreur, ni dans les logs de mon serveur mais par contre IE me dit Impossible d'afficher la page sans me donner de codes d'erreur...

Si quelqu'un à une idée...

Cordialement.
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
5 juin 2008 à 18:17
Ton problème est quand même très spécifique. Vu que c'est de la programmation système windows, je peux te conseiller de t'adresser à ce forum.
Les connaissant, ils sauront certainement t'aider ;-)
0
juanpablo Messages postés 142 Date d'inscription mercredi 30 mai 2007 Statut Membre Dernière intervention 16 juin 2008 10
5 juin 2008 à 19:59
bonsoir

je crois comprendre ce que tu veux, j'ai fait de meme ,tu as deux solutions

Puisque si IE n'est pas fermé alors le CSP reste en mémoire donc il ne laisse pas la DLL non plus et donc elle ne peut pas être supprimée.
là il y a une erreur : IE garde le CSP en memoire ok mais c'est toi qui geres la dll finale
si tu utilises loadlibrary et freelibrary dans le csp tu fais des appels a la dll et tu la relaches a la fin

2e solution: la dll est un objet COM et le CSP obtient un interface quand il doit faire quelquechose
ça revient a gerer sa durée de vie par addref , release et son activation par cocreateinstance et ça répond à ton cas


jp
0
kzanadeus Messages postés 70 Date d'inscription lundi 3 décembre 2007 Statut Membre Dernière intervention 4 décembre 2009 3
6 juin 2008 à 09:15
Merci pour toutes les réponses/

juanpablo :

Pour ta première solution, en fait, vu que c'est IE qui fait les commandes à mon CSP, ben je ne sais pas quand il faut relacher la DLL puisqu'une istance d'IE peut monter en mémoire le CSP dès le début faire une prcédure d'authentification, naviger pendant X heures, puis fair eune nouvelle connexion. Je ne sais pas quand la DLL doit être relachée.

pour ta deuxième solution, je ne peux pas en faire un objet com... c'est par ce que le dialogue doir être unidirectionnel entre le CSP et la DLL et à savoir du CSP à la DLL.

PS : je vais aller voir le lien... ;) merci.

Cordialement.
0
juanpablo Messages postés 142 Date d'inscription mercredi 30 mai 2007 Statut Membre Dernière intervention 16 juin 2008 10
6 juin 2008 à 14:10
bonjour

Je ne sais pas quand la DLL doit être relachée.
bien sûr que tu sais ! au dernier appel a ta dll ! ( celle que tu dois pouvoir modifier)

elle ne doit pas etre dans ton projet par un lib comme on fait d'habitude
dans le CSP tu dois gerer un flag de presence de la dll, celle que tu dois pouvoir modifier
les appels a la dll se font par des pointeurs de fonctions
au premier appel a la dll, un test de ce flag est fait
c'est là qu 'intervient un loadlibrary de la dll et une serie de getprocadress pour avoir les pointeurs
le dernier appel a la dll doit ertre suivi de freelibrary

cette methode est classique pour les dll printprocessor : elles sont bloquées par le systeme .
ce qui entraine de rebooter a chaque test de nouveau code
donc une dll bidon qui est vue comme la dll printperocessor par le systeme charge la vrai dll lors d'une impression puis la libere on peut alors la remplacer
0