c++ - c++到delphi转换
问题描述
现在我试图从我的大华终端获取图片,代码变成了一个小技巧。
在 C++ 示例代码中,我有:
//Struct
// face info
typedef struct tagNET_ACCESS_FACE_INFO
{
char szUserID[32]; // user ID
int nFaceData; // count of face data,the max number is 20
char szFaceData[20][2048]; // face data
int nFaceDataLen[20]; // face data length
int nFacePhoto; // count of face photo,max size: 5
int nInFacePhotoLen[5]; // the size of each photo used by the user
int nOutFacePhotoLen[5]; // the actual size of each photo
char* pFacePhoto[5]; // face photo data,max size: 120K
BYTE byReserved[2048]; // reserved
} NET_ACCESS_FACE_INFO;
//Part of the c++ code
//...
NET_ACCESS_FACE_INFO stuFaceInfo;
memset(&stuFaceInfo,0,sizeof(stuFaceInfo));
for (int i=0;i<5;i++)
{
stuFaceInfo.nInFacePhotoLen[i] = 100*1024;
stuFaceInfo.pFacePhoto[i] = new char[100*1024]; //<-- Don´t know how do it
memset(stuFaceInfo.pFacePhoto[i],0,100*1024);
}
stuFaceGetOut.pFaceInfo = &stuFaceInfo;
我转换成这个 Delphi 代码:
// face info Record
PNetAccessFaceInfo = ^TNetAccessFaceInfo;
TNetAccessFaceInfo = record
szUserID: array[0..31] of AnsiChar; // user ID
nFaceData: Integer; // count of face data,the max number is 20
szFaceData: array[0..19, 0..2047] of AnsiChar; // face data
nFaceDataLen: array[0..19] of Integer; // face data length
nFacePhoto: Integer; // count of face photo,max size: 5
nInFacePhotoLen: array[0..4] of Integer; // the size of each photo used by the user
nOutFacePhotoLen: array[0..4] of Integer; // the actual size of each photo
pFacePhoto: array[0..4] of PAnsiChar; // face photo data,max size: 120K
byReserved: array[0..2047] of Byte; // reserved
end;
...
var
faceInfo: TNetAccessFaceInfo;
begin
...
ZeroMemory(@faceInfo,sizeOf(faceInfo));
for I := 0 to 4 do
begin
faceInfo.nInFacePhotoLen[i] := 100*1024;
ZeroMemory(@faceInfo.pFacePhoto[i],sizeof(faceInfo.pFacePhoto[i])); //<-- this get nothing, no error code, no crash
// faceInfo.pFacePhoto[i] := pAnsichar(100*1024); //<-- tryed this but got a exception
FillChar(faceInfo.pFacePhoto[i],0,100*1024);
end;
随着pFacePhoto *char[5]
我转换为pFacePhoto : Array [0..4] of PAnsiChar;
但是在示例代码中,...pfacePhoto[i] = new char[100*1024]
以我对 C++ 的有限了解意味着PAnsiChar
接收 Delphi 数组[0..(100*1024)-1] of AnsiChar
。
既然pFacePhoto[i]
是 a PAnsiChar
,我可以创建一个新的数组AnsiChar
并指向它吗?
运行我的 Delphi 代码,我得到这个GetLastError()
:
#define NET_RETURN_DATA_ERROR _EC(21) // Error occurs when verify returned data.
解决方案
但是在示例代码中,
...pfacePhoto[i] = new char[100*1024]
以我对 C++ 的有限了解意味着PAnsiChar
接收 Delphi 数组[0..(100*1024)-1] of AnsiChar
。既然
pFacePhoto[i]
是 aPAnsiChar
,我可以创建一个新的 AnsiChar 数组并指向它吗?
是的,这正是您需要做的。您需要分配一个元素100*1024
数量的数组AnsiChar
,然后指向pFacePhoto[i]
该数组的第一个元素。
有不同的方法可以做到这一点,例如使用GetMem()
:
var
faceInfo: TNetAccessFaceInfo;
begin
...
ZeroMemory(@faceInfo, SizeOf(faceInfo));
for I := 0 to 4 do
begin
faceInfo.nInFacePhotoLen[i] := 100*1024;
GetMem(faceInfo.pFacePhoto[i], 100*1024);
ZeroMemory(faceInfo.pFacePhoto[i], 100*1024);
end;
...
for I := 0 to 4 do
begin
FreeMem(faceInfo.pFacePhoto[i]);
end;
或者,使用AnsiStrings.AnsiStrAlloc()
:
uses
..., AnsiStrings;
var
faceInfo: TNetAccessFaceInfo;
begin
...
ZeroMemory(@faceInfo, SizeOf(faceInfo));
for I := 0 to 4 do
begin
faceInfo.nInFacePhotoLen[i] := 100*1024;
faceInfo.pFacePhoto[i] := AnsiStrAlloc(100*1024);
ZeroMemory(faceInfo.pFacePhoto[i], 100*1024);
end;
...
for I := 0 to 4 do
begin
StrDispose(faceInfo.pFacePhoto[i]);
end;
推荐阅读
- python - 我如何从互联网上随机拍摄一张照片(从关键字的结果中),然后让 python 显示给我看?
- javascript - Spark AR - 启用从脚本到补丁编辑器的动画
- java - 根据预定义的规则集将输入集分类
- angular - 如何将布尔值从服务发送到可观察的组件?(Angular)
- php - 为什么我在使用 axios 发出 post 请求时收到 500 服务器错误?
- javascript - 使用 TypeScript 的 Vue i18n 出错:“类型 'VueConstructor' 上不存在属性 '$t'。”。我该如何解决?
- c# - 如何使用循环将 URL 中的字符串替换为列表中的每个整数?
- ios - 无法从 UIView Popover Dismiss 传回数据
- php - 如何使用 curl 获取 cookie 值
- asp.net-core - 多租户应用程序中的 AddJwtBearer