2012-05-03 9 views
0

私は何時間もこれを研究してきました。私はC++にはまったく新しく、これまでに見つけた解決策を理解していません。Visual C++ Formsアプリケーションエラー:C3374

私は自分のフォームアプリケーションでの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です。

erroringラインがある:私はうまくこの問題を解決する方法について&単純な答えを説明見つけるために探しています

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

。 :/

答えて

1

メンバー関数へのポインタを渡そうとしています。非メンバ関数へのポインタが必要です。あなたは必要な機能を果たす関数を書く必要がありますが、ではなく、クラスのメンバーとしてです。

少なくともメモリが使用されている場合、電話で指定したファイルに書き込まれたデータをCURLOPT_WRITEDATAにしたい場合は、CURLOPT_WRITEFUNCTIONをまったく使用する必要はありません。デフォルトの機能は、あなたが渡すファイル。

私はまた、(エラーメッセージ内のデリゲートインスタンスの言い回しに基づいて)実際のC++の代わりにC++/CLIを使用しているようだと言います。 C++/CLIはいくつかの点でC++にかなり似ていますが、半定期的に問題を引き起こすには十分に異なるものがあります。

+0

'write_data'メソッドを静的メンバーにするだけで十分でしょうか? – harper

+0

@harper:通常のC++では、おそらく、おそらく。 C++/CLIの下では、私はあまり確かではありません。 –

関連する問題