2010-08-29 8 views
2

J'ai reçu une DLL que j'essaie d'utiliser. La DLL contient la fonction "envoyer". ce que je l'ai fait:Comment importer une fonction DLL dans C?

#include <stdio.h> 
#include <Windows.h> 

int main(int argc, char * argv[]) 
{ 
    HMODULE libHandle; 

    if ((libHandle = LoadLibrary(TEXT("SendSMS.dll"))) == NULL) 
    { 
     printf("load failed\n"); 
     return 1; 
    } 
    if (GetProcAddress(libHandle, "send") == NULL) 
    { 
     printf("GetProcAddress failed\n"); 
     printf("%d\n", GetLastError()); 
     return 1; 
    } 
    return 0; 
} 

GetProcAddress retourne NULL, et la dernière valeur d'erreur est 127. (procédure n'a pas été trouvé)

Qu'est-ce que je fais mal?

+1

Avez-vous DLLEXPORT cette fonction 'send'? – kennytm

+0

Je n'ai pas écrit ce fichier DLL ... – Mikey

Répondre

4

Le code semble plus ou moins bon, donc quelque chose ne va pas avec * .dll. Veuillez télécharger l'application Dependency Walker et vérifier quelles types de fonctions sont exportées par cette bibliothèque.

+0

Une seule fonction est exportée - "MAGIC_BIND". En fait, l'exemple de code qui a été donné était dans Magic. Est-il possible que la DLL ne puisse être utilisée que par Magic? – Mikey

+0

L'appel de cette fonction nécessite de la magie. http://www.ng-sw.de/mg-wikka/MagicDLLs –

0

La DLL n'exporte probablement pas une telle fonction.

Ceci est généralement causé par les "décorations" que le compilateur ajoute au nom de la fonction. Par exemple "envoyer" peut effectivement être considéré comme:

Pour résoudre ce qui est ce que vous devez faire:

  1. Utilisez le " dépend de "l'utilitaire (depends32.exe, livré avec MSVC) pour voir ce que votre DLL effectivement exportations.
  2. Si vous êtes l'auteur de la DLL - vous pouvez forcer le nom d'exportation pour être ce que vous voulez, en utilisant le fichier « DEF » (pour linker)
0

J'ai remarqué que vous utilisez TEXT LoadLibrary, mais pas sur GetProcAddress. Si GetProcAddress interprète mal votre chaîne, il se peut que vous recherchiez la mauvaise fonction.

+0

GetProcAddress ne prend pas de chaînes étendues. – dreamlax

2

Si vous exécutez l'environnement 64 bits et que «sendsms.dll» est compilé en tant que 32bit, la bibliothèque de chargement ne fonctionne pas. Vous devez compiler votre projet en 32 bits pour charger les DLL.

Questions connexes