0

私はこれを何時間も研究してきました。私はC++に非常に慣れていないので、これまでに見つけた解決策を理解していません。

フォームアプリケーションでcURLファイルダウンローダーを作成しようとしていますが、次のようなエラーが発生します。

Error   50  error C3374: can't take address of 'EmperorAntiVirusInstaller::FileDownloader::write_data' unless creating delegate instance    c:\users\bailey\documents\visual studio 2010\projects\emperor antivirus installer\emperor antivirus installer\FileDownloader.h  97

コードは次のとおりです。

private:
    size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream) {
        size_t written;
        written = fwrite(ptr, size, nmemb, stream);
        return written;
    }
    System::Void beginDownload(void) {
        CURL *curl;
        FILE *fp;
        CURLcode res;
        char *url = "http://localhost/aaa.txt";
        char outfilename[FILENAME_MAX] = "C:\\bbb.txt";
        curl = curl_easy_init();
        if(curl) {
            fp = fopen(outfilename,"wb");
            curl_easy_setopt(curl, CURLOPT_URL, url);
            curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &FileDownloader::write_data);
            curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
            res = curl_easy_perform(curl);
            curl_easy_cleanup(curl);
            fclose(fp);
        }
    }

さらに、フォームの名前はFileDownloaderです。

エラー行は次のとおりです。

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &FileDownloader::write_data);

この問題を解決する方法について、わかりやすく説明された簡単な答えを探しています。:/

4

1 に答える 1

1

メンバー関数へのポインターを渡そうとしています。非メンバー関数へのポインターが必要です。クラスのメンバーとしてではなく、必要なことを実行する関数を作成する必要があります。

少なくともメモリが機能する場合、呼び出しで指定したファイルにデータを書き込むだけであれば、CURLOPT_WRITEDATA使用する必要はまったくありませんCURLOPT_WRITEFUNCTION。デフォルトの関数は、渡したファイルにデータを書き込むだけです。

ただし、(エラーメッセージでのデリゲートインスタンスの言及に基づいて)実際のC++ではなくC++/CLIを使用しているように見えることにも言及する必要があると思います。その場合、他のほとんどすべてはおそらく少なくとも少しの質問に開かれています-C ++ /CLIはいくつかの点でC++にかなり似ていますが、半定期的に問題を引き起こすのに十分な違いがあります。

于 2012-05-03T03:58:49.207 に答える