Ich versuche zu lernen, wie LoadLibrary
richtig in einer C
Funktion zu verwenden, aber ich habe Schwierigkeiten und es gibt nicht viele gute Tutorials zu folgen. Ich habe ein einfaches C-Programm erstellt, das die Bibliothek libCurl
verwendet, um den HTML-Code einer Website erfolgreich abzurufen und auf die Konsole zu drucken. Ich versuche jetzt, die gleiche Funktion mit LoadLibrary
und GetProcAddress
und der libcurl.dll
wieder zu implementieren.Zurückgeben von Daten von der Funktion, die von LoadLibrary in C geladen wird?
Wie gebe ich Daten von einer Funktion zurück, die in den Speicher geladen wird?
Nachstehend ist die Funktion mit der .lib, die funktioniert und anschließend die Funktion versucht, die DLL zu verwenden, die nicht kompilieren können.
Hier ist mein Arbeitsprogramm:
#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;
}
Hier ist mein Versuch, die gleiche Funktionalität mit LoadLibrary
nur (das heißt nicht das libCurl.lib verwendet wird) zu replizieren. Aber ich bekomme die folgende Fehlermeldung und kann nicht feststellen warum.
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;
}
einfach: 'typedef ROTATION (* CurlInitFunc)(); '->' typedef CURL * (* CurlInitFunc)(); ' –
Detail: Vergessen Sie nicht die' FreeLibrary (hLib); 'am Ende. –
Ein weiteres Detail: Rename '_CurlInitFunc' zu' _curl_easy_init', der Code wird besser lesbar sein. –