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");
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:
GetNumber
GetNumber
, mais elle n'est pas marquée extern "c"
, Ce qui entraîne changement de nom .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:
__declspec(dllexport) int GetNumber();
S'il s'avère être n ° 2 ci-dessus, vous devez le faire:
extern "C"
{
__declspec(dllexport) int GetNumber();
};
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
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.