如何解决如何通过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
函数中,也许有某种方法可以直接解码为字符数组而不是向量,但是只有您知道这一点。
问题在于为该图像分配(和释放)内存;谁对此负责?
您不能(不应)在一个模块中分配内存,而在另一个模块中释放内存。
您的两个选项是:
- 在调用方分配足够大的缓冲区,并让DLL使用它{{1}}。这里的问题是:什么足够大?某些Win API提供了一种查询所需大小的附加方法。不适合这种情况,因为DLL要么不得不第二次获取该映像,要么(无限期地)保留它,直到您要求它为止。
- 在DLL中分配所需的缓冲区并返回指向它的指针。您需要确保在调用者请求释放它之前,它不会被释放(在单独的API中)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。