Bonjour à tous,
Je développe actuellement un controle ActiveX qui fait appel à une DLL externe (je n'ai pas les sources de cette DLL).
Je charge la DLL dynamiquement en utilisant LoadLibrary et GetProcAddress.
Voila comment je procède :
Note : maFonction renvoie un booléen, et est censée renvoyer true si tout ce passe correctement. Mon code est fictif, je ne veux pas mettre le code réel, mais c'est exactement ce qui se passe actuellement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 HINSTANCE handleDLL = NULL; TYPEPOINTEURFONCTION maFonction = NULL; DWORD error; if( (handleDLL = LoadLibrary("./maDLL")) == NULL || (maFonction = (TYPEPOINTEURFONCTION)GetProcAddress("maFonction")) == NULL ) return false; error = GetLastError(); if(!maFonction()) { DWORD error = GetLastError(); return(false); }
J'avais essayé ce bout de code dans un main d'un projet vide, et la DLL est bien chargée, la fonction bien linkée et l'appel à la fonction renvoie true.
Maintenant, si je passe ce bout de code dans une des méthode de mon controle ActiveX, la DLL est toujours bien chargée (tout du moins LoadLibrary ne renvoie pas NULL), la fonction est toujours bien linkée (tout du moins GetProcAddress ne renvoie pas NULL), mais l'appel à la fonction me renvoie false (pourquoi pas) et surtout, GetLastError me renvoie 126 (ERROR_MOD_NOT_FOUND) tout de suite après (quand il valait 0 juste avant l'appel à la fonction).
La spécification de la méthode que j'appelle stipule, qui plus est, que les code d'erreurs possiblement renvoyés par la fonction dans GetLastError sont compris entre 1 et 60.
Ce qui m'étonne le plus, c'est ce changement de comportement entre ce bout de code executé dans un projet vide, et le même bout de code exécuté dans une méthode d'un controle ActiveX.
J'ai également essayé la même chose mais avec la DLL linkée en statique et le résultat est le même.
Avez-vous des pistes de recherche pour comprendre ce comportement étonnant ?
Partager