2012-05-03 4 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

@ 하퍼 : 정상적인 C++에서는 가능합니다. C++/CLI에서 나는 덜 확신합니다. –

관련 문제