2017-02-24 2 views
0

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; 
} 
+1

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

+1

Detail: Vergessen Sie nicht die' FreeLibrary (hLib); 'am Ende. –

+0

Ein weiteres Detail: Rename '_CurlInitFunc' zu' _curl_easy_init', der Code wird besser lesbar sein. –

Antwort

1

dieser Zeile:

typedef CURL (*CurlInitFunc)(); 

deklariert einen Zeiger auf eine Funktion, die eine CURL zurückgibt. Aber der Prototyp curl_easy_init() ist:

CURL *curl_easy_init(); 

, das heißt, es gibt einen Zeiger-CURL, das heißt CURL*

Deshalb ist die richtige Erklärung ist:

typedef CURL *(*CurlInitFunc)(); 
Verwandte Themen