2015-05-17 53 views
0

我需要從C#調用本地​​C++。 C++庫中的一種方法需要讀取網頁內容 - 我決定通過cURL庫來完成。我創建了一個的Visual C++ - > CLR - >類庫項目,現在我的圖書館看起來是這樣的:在Visual Studio C++類庫中回調

#pragma once  
#include <stdio.h> 
#include <string> 
#include <curl/curl.h> 

using namespace System; 

namespace HtmlCppParser { 

    public ref class HtmlCppParser 
    { 
    public: 
     String^ GetContent(String^ url){ 
      CURL *curl; 
      CURLcode res; 
      String^ content; 

      curl = curl_easy_init(); 
      if (curl) { 
       curl_easy_setopt(curl, CURLOPT_URL, url); 
       curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, this->write_data); 
       curl_easy_setopt(curl, CURLOPT_WRITEDATA, &content); 
       res = curl_easy_perform(curl); 
       curl_easy_cleanup(curl); 

       return content; 
      } 
     } 

    private: 
     size_t write_data(void *contents, size_t size, size_t nmemb, void *userp) 
     { 
      ((std::string*)userp)->append((char*)contents, size * nmemb); 
      return size * nmemb; 
     } 
    }; 
} 

當我編譯此,我得到C3867錯誤:

錯誤C3867 :HtmlCppParser :: HtmlCppParser :: write_data:函數調用缺少參數列表;使用「& HtmlCppParser :: HtmlCppParser :: write_data」...

我的錯誤在哪裏?

回答

1

我認爲最簡單的解決方案將是使write_data「經典」 C-功能(將它移出HtmlCppParser類)和&write_data更換this->write_data,因爲你似乎收到通過userp指針所需的一切。

而且您應該注意,您通過curl_easy_setopt(curl, CURLOPT_WRITEDATA, &content);提供System::String,但將其轉換爲write_data內的std::string。您應該也可以在GetContent中使用std::string,或者可能使用System::Text::StringBuilder替換它們。

+0

謝謝。太感謝你downvoter! – Konstantin