微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何通过char **

如何解决如何通过char **

对C ++还是陌生的,我仍在努力使用指针指向指针,并且不确定下面的方法是否正确返回解码的图像字节。

方法从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();
    }

    ...
}

调用方以如下方式调用方法

char mUid[64];
char* mImage;
long mImageSize;
...
resultCode = GetInfoAndPicture(mUid,&mImage,&mImageSize);

//process image given its data and its size

我知道什么是指针,我的问题是针对此行的

image = (char**)&imageBytes;

在给出上述方法签名和方法调用的情况下,这是通过char** image形式参数将从base64解码的图像返回到调用代码中的正确方法吗?

我确实收到错误“程序...。文件:minkernel \ crts \ ucrt \ src \ appcrt \ convert \ isctype.cpp ...”表达式c> = -1 && c ,我认为这与以下事实有关:该行未正确传回数据。

解决方法

鉴于需求,没有任何方法可以避免分配更多的内存和复制字节。您不能直接使用向量,因为该向量是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();

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

,

问题在于为该图像分配(和释放)内存;谁对此负责?

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

您的两个选项是:

  1. 在调用方分配足够大的缓冲区,并让DLL使用它{{1}}。这里的问题是:什么足够大?某些Win API提供了一种查询所需大小的附加方法。不适合这种情况,因为DLL要么不得不第二次获取该映像,要么(无限期地)保留它,直到您要求它为止。
  2. 在DLL中分配所需的缓冲区并返回指向它的指针。您需要确保在调用者请求释放它之前,它不会被释放(在单独的API中)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。