Question sur GetProcAddress et LockResource

Signaler
Messages postés
96
Date d'inscription
vendredi 1 avril 2005
Statut
Membre
Dernière intervention
26 juillet 2007
-
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
-
Bonjour tout le monde.

J'ai rencontré un truc étrange en faisant un test.
J'essaye de récupérer l'adresse de la fonction LockResource depuis la dll Kernerl32.

Voici le petit bout de code que j'utilise :

/******************************/
#include <windows.h>

typedef LPVOID (__stdcall* apiLockResource) (HGLOBAL hResData);
apiLockResource MyLockResource;

int main()
{
  HMODULE hmod;
  hmod = LoadLibrary("kernel32.dll");

  MyLockResource = (apiLockResource)GetProcAddress(hmod, "LockResource");

  FreeLibrary(hmod);

  return 0;
}
/******************************/

Et voici ce que j'obtient lors du debug de l'application :
http://img87.imageshack.us/my.php?image=pbod7.png

Pour information :
- j'ai fait le test sous Windows 2000 et XP
- j'ai utilisé GCC GNU Compiler avec code bloc et Pelles C

J'obtient le même résultatà chaque fois.

Ma question est donc la suivante : Pourquoi le debugger affiche l'adresse d'une autre fonction de l'API Windows ?

Merci de m'éclairer si vous avez une petite idée car j'aimerais bien comprendre histoire de me coucher moins bête ce soir

4 réponses

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Je confirme le problème:

#include <windows.h>

typedef LPVOID (__stdcall* apiLockResource) (HGLOBAL hResData);
apiLockResource MyLockResource1;
apiLockResource MyLockResource2;
apiLockResource MyLockResource3;

int main()
{
  HMODULE hmod;
  hmod = LoadLibrary("kernel32.dll");

  MyLockResource1 = (apiLockResource)GetProcAddress(hmod, "LockResource");
  MyLockResource2 = (apiLockResource)GetProcAddress(hmod, "SetHandleCount");
  MyLockResource3 = (apiLockResource)GetProcAddress(hmod, "LoadResource");

  FreeLibrary(hmod);

  return 0;
}

Avec ce programme, j'obtiens la même valeur avec MyLockResource1 et MyLockResource2.
Je ne sais pas à quoi sert cette fonction SetHandleCount, elle est décrite comme obsolète.

Tu as essayé d'utiliser malgré tout d'utiliser l'adresse que tu récupères avec GetProcAddress?

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
96
Date d'inscription
vendredi 1 avril 2005
Statut
Membre
Dernière intervention
26 juillet 2007

Salut vecchio56,

Oui j'ai essayé et ça ne semble pas poser problème.

As-tu essayer le bout de code avec Visual C++ (je ne l'ai pas) pour voir si on a la même chose.

Le plus étrange c'est que j'ai la même chose si j'appelle directement la fonction LockResource (cf. capture d'écran)

Avec GetProcAddress :

Depuis LockResource directement :

C'est vraiment bizarre mais je vais finir par croire que c'est "normal".

ps: y a t'il moyen de modifier le sujet de thread avec le titre suivant : "Question sur GetProcAddress et LockResource"
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
J'ai modifié le tire principal
Oui j'ai essayé avec Visual C++. Peut être que SetHandleCount et LockResource servent à faire la même chose

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Salut,
Je pense que LockResource() est également obsolète. Elle n'est gardée que pour compatibilité avec les anciens Windows (3.1). Il parait que dans les systèmes récents, une ressource chargée en mémoire n'est pas déplaçable donc LockResource ne sert plus à rien. En effet, LoadResource() retourne en réalité un pointeur sur le premier octet de la ressource chargée. Un simple cast vers le type de pointeur voulu résoud le problème. J'utilise toujours cette méthode et je n'ai jamais rencontré de problème.
J'attends confirmation.
J'aimerais bien que notre ami BruNews jette un coup d'oeil sur le code source de LockResource() car apparemment elle ne fait que retourner le pointeur qu'on lui passe comme paramètre.