C++ c++;delphi转换
现在我正试图从我的大华终端获取图片,代码变成了一个小把戏 <>在C++示例代码中,我有: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];//用
//结构
//面部信息
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()
将接收对字符数据的引用。