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;
}
simplement: 'typedef CURL (* CurlInitFunc)(); '->' typedef CURL * (* CurlInitFunc)(); ' –
Détail: ne pas oublier la' FreeLibrary (hLib); 'à la fin. –
Un autre détail: Renommez '_CurlInitFunc' en' _curl_easy_init', votre code sera plus lisible. –