2017-02-24 2 views
0

J'essaie d'apprendre comment utiliser LoadLibrary correctement dans une fonction C, mais j'ai de la difficulté et il n'y a pas beaucoup de bons tutoriels à suivre. J'ai créé un simple programme C qui utilise la bibliothèque libCurl pour récupérer le code HTML d'un site Web et l'imprimer sur la console. J'essaie maintenant de ré-implémenter la même fonction en utilisant LoadLibrary et GetProcAddress et le libcurl.dll.Renvoyer des données de la fonction chargée par LoadLibrary en C?

Comment puis-je transmettre des données à partir d'une fonction chargée en mémoire?

Vous trouverez ci-dessous la fonction utilisant le fichier .lib qui fonctionne et, par la suite, la fonction essayant d'utiliser la DLL qui ne parvient pas à compiler.

Voici mon programme de travail:

#include "stdafx.h" 
#include "TestWebService.h" 
#include "curl/curl.h" 

int main(int argc, char **argv) 
{ 
    CURL *curl; 
    CURLcode res; 

    curl = curl_easy_init(); 
    if (curl) { 

     struct string s; 
     init_string(&s); 

     curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); 
     /* example.com is redirected, so we tell libcurl to follow redirection */ 
     curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); 
     curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); 
     curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); 

     /* Perform the request, res will get the return code */ 
     res = curl_easy_perform(curl); 
     /* Check for errors */ 
     if (res != CURLE_OK) 
      fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); 

     /* always cleanup */ 
     printf("%s\n", s.ptr); 
     free(s.ptr); 
     curl_easy_cleanup(curl); 
    } 

    return 0; 
} 

Voici ma tentative de reproduire la même fonctionnalité en utilisant uniquement LoadLibrary (à savoir de ne pas utiliser la libCurl.lib). Mais je reçois le message d'erreur suivant et ne peux pas déterminer pourquoi.

1) a value of type "CURL" cannot be assigned to an entity of type "CURL *" 
2) '=': cannot convert from 'CURL' to 'CURL *' 

#include "stdafx.h" 
#include "TestWebService.h" 
#include "curl/curl.h" 

typedef CURL (*CurlInitFunc)(); 

int main(int argc, char **argv) 
{ 
    HINSTANCE   hLib = NULL; 
    hLib = LoadLibrary("libcurl.dll"); 
    if (hLib != NULL) 
    { 
     CURL *curl; 
     CurlInitFunc _CurlInitFunc; 
     _CurlInitFunc = (CurlInitFunc)GetProcAddress(hLib, "curl_easy_init"); 
     if (_CurlInitFunc) 
     { 
      curl = _CurlInitFunc(); 

     } 

    } 
    return 0; 
} 
+1

simplement: 'typedef CURL (* CurlInitFunc)(); '->' typedef CURL * (* CurlInitFunc)(); ' –

+1

Détail: ne pas oublier la' FreeLibrary (hLib); 'à la fin. –

+0

Un autre détail: Renommez '_CurlInitFunc' en' _curl_easy_init', votre code sera plus lisible. –

Répondre

1

Cette ligne:

typedef CURL (*CurlInitFunc)(); 

déclare un pointeur vers une fonction qui renvoie une CURL. Mais le prototype de curl_easy_init() est:

CURL *curl_easy_init(); 

qui signifie qu'il renvoie un pointeur -CURL, qui est CURL*

Par conséquent, la déclaration correcte est:

typedef CURL *(*CurlInitFunc)();