[英]Callback in Visual Studio C++ Class Library
我需要從C#調用本機C ++。 C ++庫中的一種方法需要讀取網頁內容-我決定通過cURL庫進行此操作。 我創建了一個Visual C ++-> CLR->類庫項目,現在我的庫如下所示:
#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” ...
我的錯在哪里?
我認為最簡單的解決方案是使write_data
成為“經典的” C函數(將其從HtmlCppParser
類中HtmlCppParser
),並用&write_data
替換this->write_data
&write_data
,因為您似乎可以通過userp
指針接收到所有需要的userp
。
而且您應該注意要通過curl_easy_setopt(curl, CURLOPT_WRITEDATA, &content);
提供System::String
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &content);
但將其強制轉換為write_data
內的std::string
。 您可能也應該在GetContent
使用std::string
,或者用System :: Text :: StringBuilder替換兩者。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.