简体   繁体   English

SDK指针问题-将C ++转换为Delphi

[英]Problem with SDK pointers - c++ to Delphi translating

I'm struggling with HikVision SDK, trying to get it work in Delphi. 我在努力使用HikVision SDK,试图使其在Delphi中运行。 There's some samples in C++, but I've stuck with pointers issues while translating to Delphi. C ++中有一些示例,但是在转换为Delphi时我一直遇到指针问题。 Till that moment code seems to work, as I get correct plate number. 直到那一刻,当我获得正确的车牌号时,代码似乎可以正常工作。
Is this correct equivalent: BYTE *pBuffer -> PByte ? 这是否正确等效:BYTE * pBuffer-> PByte?
How to extract picture from pBuffer? 如何从pBuffer中提取图片?

C++ code: C ++代码:

typedef struct tagNET_ITS_PICTURE_INFO
{
    DWORD   dwDataLen;            //Media data length
    BYTE    byType;                
    BYTE    byAbsTime[32];
    NET_VCA_RECT   struPlateRect;
    BYTE    *pBuffer;              //Data pointer
    DWORD   dwUTCTime;
    //...
}NET_ITS_PICTURE_INFO, *LPNET_ITS_PICTURE_INFO;


typedef struct tagNET_ITS_PLATE_RESULT
{
    //...
    NET_DVR_PLATE_INFO  struPlateInfo;
    NET_ITS_PICTURE_INFO struPicInfo[6];
}NET_ITS_PLATE_RESULT, *LPNET_ITS_PLATE_RESULT;


void CALLBACK MSesGCallback(LONG lCommand, NET_DVR_ALARMER *pAlarmer, char *pAlarmInfo, DWORD dwBufLen, void* pUser)
{
    char filename[100];
    FILE *fSnapPic = NULL;

    switch (lCommand) {

        case COMM_ITS_PLATE_RESULT: {
            NET_ITS_PLATE_RESULT struITSPlateResult = { 0 };
            memcpy(&struITSPlateResult, pAlarmInfo, sizeof(struITSPlateResult));

            printf("Plate: %s\n", struITSPlateResult.struPlateInfo.sLicense);
            if (struITSPlateResult.struPicInfo[0].dwDataLen != 0)
            {
                sprintf(filename, "./pic/%d.jpg", 0);
                fSnapPic = fopen(filename, "wb");
                fwrite(struITSPlateResult.struPicInfo[0].pBuffer, struITSPlateResult.struPicInfo[0].dwDataLen, 1, fSnapPic);
                fclose(fSnapPic);
            }
        }
    }
    return;
}

Delphi code: Delphi代码:

  LPNET_ITS_PICTURE_INFO = ^NET_ITS_PICTURE_INFO;
  NET_ITS_PICTURE_INFO = record
    dwDataLen: DWORD;
    byType: BYTE;
    byAbsTime: array [0..31] of BYTE;
    struPlateRect: NET_VCA_RECT;
    pBuffer: PByte;                  // ????????
    dwUTCTime: DWORD;
    //(...)
  end;


  LPNET_ITS_PLATE_RESULT = ^NET_ITS_PLATE_RESULT;
  NET_ITS_PLATE_RESULT = record
    //(...)
    struPlateInfo: NET_DVR_PLATE_INFO;
    struPicInfo: Array [0..5] of NET_ITS_PICTURE_INFO;
  end;


procedure MessageCallBack(lCommand:longint; pAlarmer:LPNET_DVR_ALARMER; pAlarmInfo:PAnsiChar; dwBufLen:LongInt; pUser:pointer); stdcall;
var
 struAlarmInfo: LPNET_DVR_ALARMINFO_V30;
 struPlateResult: LPNET_ITS_PLATE_RESULT;
begin
  case lCommand of
    COMM_ITS_PLATE_RESULT:
      begin
        New(struPlateResult);
        FillChar(struPlateResult^, SizeOf(NET_ITS_PLATE_RESULT), 0);
        Move(pAlarmInfo^, struPlateResult^, Sizeof(NET_ITS_PLATE_RESULT));
        Form1.memoOut.Lines.Add('sLicense: ' + struPlateResult.struPlateInfo.sLicense);

        if (struPlateResult.struPicInfo[0].dwDataLen >0) then
          ??? how to get the picture from struPlateResult.struPicInfo[0].pBuffer ?

      end;
  end;
end;

Regards 问候

Yes, PByte or PByteArray is correct translation. 是的, PBytePByteArray是正确的转换。

If buffer contains valid file contents, you can save it into file: 如果缓冲区包含有效的文件内容,则可以将其保存到文件中:

FS := TFileStream.Create('test.jpg', fmCreate);
try
   FS.Write(struITSPlateResult.struPicInfo[0].pBuffer^,
            struITSPlateResult.struPicInfo[0].dwDataLen);
finally
  FS.Free;
end;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM