Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过char类型的methods形式参数返回base64解码图像字节** 是C++的新手,我仍然在用指针来处理指针,我不确定下面的方法是否正确地返回了解码图像字节。_C++_Dll_Casablanca - Fatal编程技术网

如何通过char类型的methods形式参数返回base64解码图像字节** 是C++的新手,我仍然在用指针来处理指针,我不确定下面的方法是否正确地返回了解码图像字节。

如何通过char类型的methods形式参数返回base64解码图像字节** 是C++的新手,我仍然在用指针来处理指针,我不确定下面的方法是否正确地返回了解码图像字节。,c++,dll,casablanca,C++,Dll,Casablanca,此方法从API获取base64编码的图像字符串。该方法必须遵循此签名,因为它是遗留代码的一部分,不允许以最初编写的方式缩写。所以签名必须保持不变。此外,为了代码的简单性,我在这里省略了异步调用和延续、异常等 int __declspec(dllexport) GetInfoAndPicture(CString uid, char **image, long *imageSize) { CString request = ""; request.Format(u

此方法从API获取base64编码的图像字符串。该方法必须遵循此签名,因为它是遗留代码的一部分,不允许以最初编写的方式缩写。所以签名必须保持不变。此外,为了代码的简单性,我在这里省略了异步调用和延续、异常等

int __declspec(dllexport) GetInfoAndPicture(CString uid, char **image, long *imageSize)
{
    CString request = "";
    request.Format(url); 

    http_client httpClient(url);
    http_request msg(methods::POST);

    ...

    http_response httpResponse;
    httpResponse = httpClient.request(msg).get();  //blocking
    web::json::value jsonValue = httpResponse.extract_json().get();

    if (jsonValue.has_string_field(L"img"))
    {
        web::json::value base64EncodedImageValue = jsonValue.at(L"img");
        utility::string_t imageString = base64EncodedImageValue.as_string();  
        std::vector<unsigned char> imageBytes = utility::conversions::from_base64(imageString);
        image = (char**)&imageBytes;  //Is this the way to pass image bytes back? 
    *imageSize = imageBytes.size();
    }

    ...
}
我知道什么是指向指针的指针,我的问题是针对这一行的

image = (char**)&imageBytes;
在给定上述方法签名和方法调用的情况下,这是通过
char**image
formal参数将从base64解码的图像返回调用代码的正确方法吗


我确实收到错误“程序…文件:minkernel\crts\ucrt\src\appcrt\convert\isctype.cpp…”表达式c>=-1&&c问题在于为该映像分配(并释放)内存;谁对此负责

您不能(不应该)在一个模块中分配内存,在另一个模块中释放内存

你的两个选择是:

  • 在调用方端分配足够大的缓冲区,并让DLL使用它
    utility::conversions::from_base64()
    。这里的问题是:什么足够大?一些WinAPI提供了一个额外的方法来查询所需的大小。不适合这种情况,因为DLL要么必须第二次获取该映像,要么(无限期地)保留它直到您请求它
  • 在DLL中分配所需的缓冲区并返回指向它的指针。您需要确保在调用方请求释放它之前不会释放它(在单独的API中)

  • 给出需求,没有任何方法可以避免分配更多内存和复制字节。不能直接使用向量,因为该向量是
    GetInfoAndPicture
    函数的本地向量,当该函数退出时将被销毁

    如果我正确理解API,那么这就是您需要做的

    //*image = new char[imageBytes.size()];  //use this if caller calls delete[] to deallocate memory
    *image = (char*)malloc(imageBytes.size());  //use this if caller calls free(image) to deallocate memory
    std::copy(imageBytes.begin(), imageBytes.end(), *image);
    *imageSize = imageBytes.size();
    

    也许在您的
    实用工具::conversions
    函数中有某种方法可以直接解码到字符数组而不是向量,但只有您知道这一点。

    imageBytes是一个局部变量。即使该转换是正确的(不是),那么在子例程退出后变量仍然会消失。您是否有权更改
    GetInfoAndPicture
    的itnerface?我知道你要对它的实施负责。谢谢你,约翰。我现在在调用std::copy的行中遇到以下错误:“调用std::copy”时参数可能不安全”和“=无法从未升级的字符转换为字符*”?我没有办法直接解码到字符数组,仅限于我上面使用的类型。@pixel抱歉我的错误,
    std::copy(imageBytes.begin(),imageBytes.end(),*image)图像<代码>之前的错过<代码>*
    。如果您比较熟悉,也可以使用
    memcpy
    做同样的工作。“不安全参数”消息只是一个警告。MS编译器对任何可能导致缓冲区溢出的事情都非常敏感,上面的代码分配了足够的空间。再次感谢。已删除第二个错误,但第一个错误仍然存在,它不是警告,而是错误“error C4996'std::copy::_Unchecked_iterators::_Deprecate”:使用可能不安全的参数调用“std::copy”-此调用依赖调用方检查传递的值是否正确。“。不,我对MeMe抄和C或C++都不太熟悉。对这些语言非常陌生。@pixel OK很高兴它能工作。因为您是C++新手,我只需提一下我给的代码内存泄漏。在某些情况下,您确实需要
    删除[]
    图像数据。@pixel似乎是合理的,如果调用者使用
    free
    则必须在此处使用
    malloc
    。我刚刚在评论中将
    deallocate()
    更改为
    delete[]
    //*image = new char[imageBytes.size()];  //use this if caller calls delete[] to deallocate memory
    *image = (char*)malloc(imageBytes.size());  //use this if caller calls free(image) to deallocate memory
    std::copy(imageBytes.begin(), imageBytes.end(), *image);
    *imageSize = imageBytes.size();