从LoadLibrary在C中加载的函数传回数据?

时间:2017-02-24 18:15:54

标签: c libcurl loadlibrary

我试图在LoadLibrary函数中学习如何正确使用C,但是遇到了困难,并且没有很多好的教程可以遵循。我创建了一个简单的C程序,它使用libCurl库成功获取网站的HTML并将其打印到控制台。我现在正尝试使用LoadLibraryGetProcAddress以及libcurl.dll重新实现相同的功能。

如何从加载到内存中的函数传回数据?

下面发布的是使用.lib的函数,后来函数尝试使用无法编译的DLL。

这是我的工作计划:

#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;
}

这是我尝试仅使用LoadLibrary复制相同的功能(即不使用libCurl.lib)。但是我收到以下错误消息,无法确定原因。

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 个答案:

答案 0 :(得分:1)

这一行:

typedef CURL (*CurlInitFunc)();

声明一个指向返回CURL的函数的指针。但curl_easy_init()的原型是:

CURL *curl_easy_init();

这意味着它会将指针返回给CURL,即CURL*

因此,正确的声明是:

typedef CURL *(*CurlInitFunc)();