Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.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
C++ c++;delphi转换_C++_Delphi_Dll - Fatal编程技术网

C++ c++;delphi转换

C++ c++;delphi转换,c++,delphi,dll,C++,Delphi,Dll,现在我正试图从我的大华终端获取图片,代码变成了一个小把戏 在C++示例代码中,我有: //结构 //面部信息 typedef结构标记网络访问面信息 { char szUserID[32];//用户ID int nFaceData;//人脸数据计数,最大值为20 char szFaceData[20][2048];//人脸数据 int nFaceDataLen[20];//面数据长度 int nFacePhoto;//人脸照片计数,最大大小:5 int nInFacePhotoLen[5];//用

现在我正试图从我的大华终端获取图片,代码变成了一个小把戏

<>在C++示例代码中,我有:

//结构
//面部信息
typedef结构标记网络访问面信息
{
char szUserID[32];//用户ID
int nFaceData;//人脸数据计数,最大值为20
char szFaceData[20][2048];//人脸数据
int nFaceDataLen[20];//面数据长度
int nFacePhoto;//人脸照片计数,最大大小:5
int nInFacePhotoLen[5];//用户使用的每张照片的大小
int nOutFacePhotoLen[5];//每张照片的实际大小
char*pFacePhoto[5];//人脸照片数据,最大大小:120K
字节byReserved[2048];//保留
}网络访问信息;
// C++代码的一部分
//...
网络访问面信息;
memset(&stuFaceInfo,0,sizeof(stuFaceInfo));
对于(int i=0;i
<>但是在样本代码中,<代码>…pFaFePosi[i]=新char(100×1024)< /代码>,在我有限的C++知识中,指<代码> PAnsiChar < /> >接收一个Delphi数组<代码> [0…..(100×1024)-1 ]的ANSICAR< <代码> < <
既然
pFacePhoto[i]
是一个
PAnsiChar
,我可以创建一个新的AnsiChar数组并指向它吗

是的,这正是您需要做的。您需要分配一个包含
100*1024
AnsiChar
元素的数组,然后将
pFacePhoto[i]
指向该数组的第一个元素

有不同的方法可以做到这一点,例如使用:

var
faceInfo:TNetAccessFaceInfo;
开始
...
零内存(@faceInfo,SizeOf(faceInfo));
对于I:=0到4 do
开始
faceInfo.nInFacePhotoLen[i]:=100*1024;
GetMem(faceInfo.pFacePhoto[i],100*1024);
零内存(faceInfo.pFacePhoto[i],100*1024);
结束;
...
对于I:=0到4 do
开始
FreeMem(faceInfo.pFacePhoto[i]);
结束;
或者,使用:

使用
…答案;
变量
faceInfo:TNetAccessFaceInfo;
开始
...
零内存(@faceInfo,SizeOf(faceInfo));
对于I:=0到4 do
开始
faceInfo.nInFacePhotoLen[i]:=100*1024;
faceInfo.pFacePhoto[i]:=AnsiStrAlloc(100*1024);
零内存(faceInfo.pFacePhoto[i],100*1024);
结束;
...
对于I:=0到4 do
开始
StrDispose(faceInfo.pFacePhoto[i]);
结束;

谢谢雷米,你能帮我理解一下这个代码吗?
m_modifyPic.SetImageDate((字节*)stuFaceInfo.pFacePhoto[0],stuFaceInfo.nOutFacePhotoLen[0]);
你到底不明白什么?
pFacePhoto[0]
是一个指向某个缓冲区的
nOutFacePhotoLen[0]
字节大小。代码正在将该缓冲区传递到
SetImageDate()
,并且想必
SetImageDate()
需要指向
BYTE[]
缓冲区的指针,而不是
char[]
缓冲区,因此调用
ms.Write()后,代码只是从
char*
BYTE*
的类型转换
,流的
位置
位于流的末尾。在调用
Picture.LoadFromStream()
之前,您需要将
位置
搜索回0,否则它将无法加载。此外,您不能使用
mlog.Lines.Add(faceinfo.pfacePhoto[i])来“检查原始数据”
因为数据一开始不是文本的。你不能像这样将原始的
PAnsiChar
类型转换为
TBytes
,因为它根本不是有效的指针。类型转换与图像数据的格式无关。没有转换的情况下加载失败的原因是你没有将数据写入
TMemoryStream
正确。您需要改为使用:
ms.Write(faceinfo.pFacePhoto[0]^,faceinfo.nOutFacePhotoLen[0]);
改为。请注意额外的
^
取消引用。
Write()的第一个参数
是一个非类型化的
常量
参数,因此它接收对传递给它的任何内容的引用。只传递
pFacePhoto[0]
Write()
将接收对
pFacePhoto[0]
本身的引用,而不是对
pFacePhoto[0]的内存的引用
指向。因此您必须取消对
pFacePhoto[0]
中指针的引用,以便
Write()
将接收对字符数据的引用。