3 question ?

3 question ? - C++ - Programmation

Marsh Posté le 05-08-2002 à 23:42:20    

Bonjour,
 
je suis un peu novice en C++ (je prog avec VC++6)
 
je me demandais tout d'abord si un pointeur HMODULE et un HINSTANCE c'était
la même chose ou pas ?
(j'ai vu une DllMain avec une HINSTANCE et une autre avec un HMODULE)
 
et ensuite, lorsqu'on charge une DLL avec LoadLibrary, je me demandais si le
pointeur HMODULE retourné correspondait à la "BaseAddress" de l'image de la
DLL dans l'espace mémoire du processus qui l'a appellé, ou s'il y avait un
rapport entre les 2, ou quoi que ce soit ?
 
et enfin, je prends un exemple :
 
je crée une DLL nommé dll.DLL, contenant une fonction : fdll
pour appeler cette DLL, on peut inclure dll.lib au linkage, et juste mettre
le prototype de fdll dans la fonction
mais on peut aussi faire ainsi :
    hMod = LoadLibrary("dll.DLL" );
    fdll = GetProcAddress(hMod,"fdll" );
 
je voudrais connaitre les différences entre ces 2 manières, par exemple
est-ce que lorsqu'on inclue dll.lib, cela crée un LoadLibrary implicitement
(je pense que oui) et si cela crée un GetProcAddress implicitement aussi (je
pense que non, je pense que l'adresse de la fonction doit directement être
écrite dans dll.lib) mais je voudrais en être sûr.
 
si personne ne peut me répondre, merci de m'aiguiller vers un autre forum


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 05-08-2002 à 23:42:20   

Reply

Marsh Posté le 06-08-2002 à 05:25:57    

Warning ! Confusion detected !
HMODULE et un HINSTANCE ne sont pas des pointeurs, ce sont des handles.
 
Et à priori, je dirais que s'il y a deux noms distincts, c'est que c'est pas la même chose...
 

Citation :

je me demandais si le pointeur HMODULE retourné correspondait à la "BaseAddress" de l'image de la DLL dans l'espace mémoire du processus qui l'a appellé, ou s'il y avait un
rapport entre les 2, ou quoi que ce soit ?

Ce secret appartient à l'OS.
 

Citation :

je voudrais connaitre les différences entre ces 2 manières, par exemple est-ce que lorsqu'on inclue dll.lib, cela crée un LoadLibrary implicitement (je pense que oui) et si cela crée un GetProcAddress implicitement aussi (je pense que non, je pense que l'adresse de la fonction doit directement être écrite dans dll.lib) mais je voudrais en être sûr.

Je pense pareil... mais je sais pas.
 
Il y a une différence s'il y a un problème avec la DLL:
La solution LoadLibrary+GetProcAddress permet de tester et d'adapter.
La solution linkage statique avorte l'exécution.


Message édité par Musaran le 06-08-2002 à 05:30:16

---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 06-08-2002 à 15:44:43    

pour le chargement des DLL, on m'a expliqué que en fait LoadLibrary + GetProcAddress charge la library en mémoire puis exécute le code de la fonction, alors que avec le .lib, la library est directement intégrée au .exe a la compilation ...


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 06-08-2002 à 17:36:47    

BlackGoddess a écrit a écrit :

pour le chargement des DLL, on m'a expliqué que en fait LoadLibrary + GetProcAddress charge la library en mémoire puis exécute le code de la fonction, alors que avec le .lib, la library est directement intégrée au .exe a la compilation ...




Non...
 
3 cas  
 
1- pas de dll mais un .lib
les fonctions utilisées par l'exe sont physiquement copiés de la lib statique vers exe. Toute la lib n'est pas copiée, et une fois le link executé le .lib n'est plus utile (pour l'execution)
 
2- dll indiquée au link
La dll est chargée au lancement de l'executable, les fonctions utiles y sont repertoriés par un numero (ordinal) fixé lors de la compil et du link.
La dll est chargée entierement (normalement) ainsi que les Dll auquelles elle fait reference. Elle est donc indispensable à l'execution, du début à la fin de l'execution.
 
3-Dll chargée lors de l'execution
C'est l'executable qui charge (et eventuellement decharge) la Dll. Celle-ci n'est pas necessaire au link de l'executable, mais par contre le programme la chargeant doit linker explicitement chaque fonction pour pouvoir l'utiliser (GetProcAdress) et il est independant de l'ordinal.

Reply

Marsh Posté le 06-08-2002 à 18:54:46    

d'accord, merci beaucoup


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 07-08-2002 à 03:24:25    

La confusion vient de ce que pour se linker à une dll, il faut spécifier un petit fichier .lib l'accompagnant.
Mais c'est pas le même que les .lib d'incorporation de code.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed