簡體   English   中英

Visual Studio C ++類庫中的回調

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM