Fonction GetProcAddress en C++
Bonjour les gars: j'ai chargé ma 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) ) "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");
C'est que la fonction exportée à partir de la DLL?
Quelle est la signature de la GetNumber fonction dans la dll?
Essayez
Si GetProcAddress() renvoie la valeur null, alors cela signifie que Windows ne peut pas localiser ce point d'entrée dans la DLL. Il n'y a également aucune raison de jeter le hDLL variable, la fonction LoadLibrary() renvoie un HMODULE qui est le premier paramètre d'entrée de GetProcAddress().
Luke: reformulez ce que vous avez dit: non âge de la pierre, des systèmes de HINSTANCE et HMODULE sont une seule et même.
Quelle est la signature de la GetNumber fonction dans la dll?
Essayez
dumpbin /exports mydll.dll
dans une invite de commande pour voir ce que les noms des exportations sont dans votre dll. Vous obtenez dumpbin avec votre VS, ou gratuit à partir de MS dans le cadre de la plate-forme SDK.Si GetProcAddress() renvoie la valeur null, alors cela signifie que Windows ne peut pas localiser ce point d'entrée dans la DLL. Il n'y a également aucune raison de jeter le hDLL variable, la fonction LoadLibrary() renvoie un HMODULE qui est le premier paramètre d'entrée de GetProcAddress().
Luke: reformulez ce que vous avez dit: non âge de la pierre, des systèmes de HINSTANCE et HMODULE sont une seule et même.
OriginalL'auteur Alireza | 2011-05-17
Vous devez vous connecter pour publier un commentaire.
La vérification des codes de retour et en appelant
GetLastError()
vous rendra libres. Vous devriez vérifier les codes de retour deux fois ici. Vous êtes en fait la vérification des codes de retour à zéro fois.Vérifier
hDLL
. Est-il NUL? Si oui, appelezGetLastError()
pour savoir pourquoi. Il peut être aussi simple que "Fichier Non Trouvé".Si
lpGetNumber
est NULL, appelGetLastError()
. Il vous dira pourquoi le proc adresse n'a pu être trouvé. Il y a quelques scénarios possibles:GetNumber
GetNumber
, mais il n'est pas marquéextern "c"
, résultant en name mangling.hDLL
n'est pas valide bibliothèque de la poignée.Si elle s'avère pour être #1 ci-dessus, vous devez exporter les fonctions par la décoration de la déclaration avec
__declspec(dllexport)
comme ceci:MyFile.h
Si elle s'avère pour être le numéro 2 ci-dessus, vous devez faire ceci:
Astuce #2 a fonctionné pour moi comme un charme! J'ai pensé que vous aviez besoin de la
extern "C"
ou__declspec(dllexport)
mais s'avère que vous avez besoin à la fois...Maintenant, pourquoi ne puis-je pas obtenir l'adresse d'une fonction de classe? 1) est-il besoin d'être un membre statique? 2) Peut-il être à l'intérieur d'un espace de noms?
Vous pouvez accéder à un membre de la classe. Vous devez fournir le nom décoré pour l'appel à
GetProcAddress
, cependant. Décorées à l'aide de noms n'a pas été expliqué dans cette réponse, malheureusement.Merci très sympa. j'ai eu ce problème aussi.
OriginalL'auteur John Dibling
Probablement
LoadLibrary()
a échoué. Vous ne pouvez pas voir que, parce que, apparemment, vous n'êtes pas vérifier ce qu'il est de retour:EDIT:
Nous ne savons pas comment vous exportez la fonction sur le code de la DLL, mais ce fil explique un couple de raisons sur pourquoi GetProcAddress échoue.
Je suis en supposant que vous savez comment créer et exporter un symbole dans une DLL. Si vous n'avez pas le cas, consultez ce tutoriel: codeguru.com/cpp/cpp/cpp_mfc/tutorials/article.php/c9855 ou celui-ci: programmers-corner.com/tutorial/4
Eh bien, votre code source est trompeuse. Dans le futur, vous pourriez vouloir corriger cela, car il viendra à votre avantage.
Mise à jour de réponse.
OriginalL'auteur karlphillip
Vous pourriez vouloir vérifier si votre
GetNumber
fonction est exportée comme un__stdcall
fonction.Si oui, essayez de
GetProcAddress(hDLL, "_GetNumber@N");
, oùN
est le nombre total d'octets deGetNumber
's de la liste d'arguments. Par exemple, si votre fonction de signature estint GetNumber(int a, double b)
, de son vrai nom dans la DLL sera_GetNumber@12
.Référence: __stdcall
OriginalL'auteur user1667687