web-dev-qa-db-fra.com

Fonction GetProcAddress en C ++

Bonjour les gars: J'ai chargé mon DLL dans mon projet mais chaque fois que j'utilise la fonction GetProcAddress. Elle renvoie NULL! Que dois-je faire? J'utilise cette fonction (double GetNumber (double x))) dans "MYDLL.dll"

Voici un code que j'ai utilisé:

typedef double (*LPGETNUMBER)(double Nbr);
HINSTANCE hDLL = NULL;
LPGETNUMBER lpGetNumber;
hDLL = LoadLibrary(L"MYDLL.DLL");
lpGetNumber = (LPGETNUMBER)GetProcAddress((HMODULE)hDLL, "GetNumber");
16
Alireza

Vérifier les codes retour et appeler GetLastError() vous libérera. Vous devriez vérifier les codes retour deux fois ici. Vous vérifiez en fait zéro fois les codes retour.

hDLL = LoadLibrary(L"MYDLL.DLL");

Vérifiez hDLL. Est-ce NULL? Si c'est le cas, appelez GetLastError() pour savoir pourquoi. Cela peut être aussi simple que "Fichier introuvable".

lpGetNumber = (LPGETNUMBER)GetProcAddress((HMODULE)hDLL, "GetNumber");

Si lpGetNumber est NULL, appelez GetLastError(). Il vous indiquera pourquoi l'adresse proc n'a pas pu être trouvée. Il existe quelques scénarios probables:

  1. Il n'y a pas de fonction exportée nommée GetNumber
  2. Il existe une fonction exportée nommée GetNumber, mais elle n'est pas marquée extern "c", Ce qui entraîne changement de nom .
  3. hDLL n'est pas un descripteur de bibliothèque valide.

S'il s'avère être n ° 1 ci-dessus, vous devez exporter les fonctions en décorant la déclaration avec __declspec(dllexport) comme ceci:

MyFile.h

__declspec(dllexport) int GetNumber();

S'il s'avère être n ° 2 ci-dessus, vous devez le faire:

extern "C"
{
  __declspec(dllexport) int GetNumber();
};
46
John Dibling

Vous voudrez peut-être vérifier si votre fonction GetNumber est exportée en tant que fonction __stdcall.

Si c'est le cas, essayez GetProcAddress(hDLL, "_GetNumber@N");, où N est le nombre total d'octets de la liste d'arguments de GetNumber. Par exemple, si la signature de votre fonction est int GetNumber(int a, double b), son vrai nom dans DLL sera _GetNumber@12.

Référence: __ stdcall

2
user1667687

Très probablement LoadLibrary() a échoué. Vous ne pouvez tout simplement pas voir cela parce qu'apparemment vous ne vérifiez pas ce qu'il retourne:

Si la fonction échoue, la valeur de retour est NULL. Pour obtenir des informations d'erreur étendues, appelez GetLastError.

MODIFIER:

Nous ne savons pas comment vous exportez la fonction sur le code DLL, mais ce fil explique quelques raisons pour lesquelles GetProcAddress échoue.

2
karlphillip