2010-06-10 14 views
0

Comment appeler une fonction à partir d'une DLL?Comment puis-je appeler une fonction à partir d'une DLL?

J'ai essayé de déclarer un pointeur vide et d'y stocker le résultat de GetProcAddress ... mais cela n'a pas fonctionné. Je voulais aussi déclarer un unsigned long int (je l'ai vu quelque part sur internet), mais je ne savais pas comment continuer. : D

Alors, est-ce que quelqu'un voudrait me donner un coup de main?

Répondre

2

Essayez quelque chose comme ceci.

typedef int (*PFuncMethods)(int args); 

hDLL = LoadLibrary(L"your.dll"); 
if(!m_hDLL) 
    return; 

methods = (PFuncMethods)GetProcAddress(hDLL,"methods"); 
if (!(methods)) { 
    FreeLibrary(hDLL); 
    hDLL = NULL; 
    methods = NULL; 
    return; 
} 

if(methods(1) == 0) ... 

Le nom de la méthode est l'endroit où vous pourriez être bloqué. C++ a le nom mangling pour la surcharge (même si elle n'est pas surchargée) et cela dépend du compilateur. Vous pouvez soit travailler sur le nom mutilé ou désactiver mangling pour la fonction en utilisant extern "C". Vous pouvez utiliser un outil comme depends.exe pour voir toutes les fonctions avec le nom exact que vous auriez à utiliser.

Il est beaucoup plus facile de lier statiquement à la DLL en utilisant le fichier lib (import) lib dans Windows.

+0

Merci d'avoir posté! Comme je l'ai déjà dit, dans un commentaire précédent, j'ai ajouté toute cette signature et mon code fonctionne sans problème. Merci beaucoup à tout le monde. – C4theWin

1

Vous devez créer un pointeur de fonction et non un pointeur vide et stocker le résultat dans ce pointeur de fonction à partir de GetProcAddress.

+0

En fait, c'était un pointeur de fonction, pointant vers une fonction vide. Désolé, mon mauvais. : D – C4theWin

1

Vous devez avoir une signature de fonction exacte et lancer le pointeur correctement.

Pour exmaple, si cela est une réception de fonction int et non avenue retour:

typedef void (*funcptr)(int); 
funcptr func = (funcptr)(void*)GetProcAddress(....) 
func(17); 

Note1: Si vous confondez la signature, très mauvaises choses peuvent se produire. Note2: vous devez également connaître la convention d'appel utilisée (cdecl, stdcall, etc.)

S'il s'agit de votre DLL, pensez plutôt à créer une bibliothèque d'importation.

+0

Merci d'avoir posté! J'ai ajouté tout ce truc de signature de fonction et ça marche maintenant! Merci encore pour votre aide. – C4theWin