private void ProcessFaceDataSearchCallback(uint dwType, IntPtr lpBuffer, uint dwBufLen, IntPtr pUserData)
        {
            if (pUserData == null)
            {
                return;
            }
            if (dwType == (uint)CHCNetSDK.NET_SDK_CALLBACK_TYPE.NET_SDK_CALLBACK_TYPE_STATUS)
            {
                uint dwStatus = (uint)Marshal.ReadInt32(lpBuffer);
                if (dwStatus == (uint)CHCNetSDK.NET_SDK_CALLBACK_STATUS_NORMAL.NET_SDK_CALLBACK_STATUS_FAILED)
                {
                    CHCNetSDK.PostMessage(pUserData, 1007, 1, 0);
                    //可以结束了,异常结束
                }
                else if (dwStatus == (uint)CHCNetSDK.NET_SDK_CALLBACK_STATUS_NORMAL.NET_SDK_CALLBACK_STATUS_EXCEPTION)
                {
                    CHCNetSDK.PostMessage(pUserData, 1007, 2, 0);
                    //可以结束了,异常结束
                }
                else if (dwStatus == (uint)CHCNetSDK.NET_SDK_CALLBACK_STATUS_NORMAL.NET_SDK_CALLBACK_STATUS_PROCESSING)
                {
                    ;
                }
                else
                {
                    CHCNetSDK.PostMessage(pUserData, 1007, 3, 0);
                    //可以结束了,异常结束
                }
            }
            else if (dwType == (uint)CHCNetSDK.NET_SDK_CALLBACK_TYPE.NET_SDK_CALLBACK_TYPE_DATA)
            {
                //输出上一包解析信息, 1009
                m_struJsonDataCfg = (CHCNetSDK.NET_DVR_JSON_DATA_CFG)Marshal.PtrToStructure(lpBuffer, typeof(CHCNetSDK.NET_DVR_JSON_DATA_CFG));

                string strFaceDataSearchReturn = Marshal.PtrToStringAnsi((IntPtr)m_struJsonDataCfg.lpJsonData, (int)m_struJsonDataCfg.dwJsonDataSize);

                m_JsonFaceDataSearchReturn = JsonConvert.DeserializeObject <CFaceDataSearchReturn>(strFaceDataSearchReturn);

                if ((m_JsonFaceDataSearchReturn.responseStatusStrg != "NO MATCH") && (m_JsonFaceDataSearchReturn.statusCode == 1))
                {
                    CHCNetSDK.PostMessage(pUserData, 1009, 0, 0);
                }

                if (m_iFaceDataRecordIndex >= m_iFaceDataRecordCount)
                {
                    CHCNetSDK.PostMessage(pUserData, 1007, 4, 0);
                    //可以结束了,正常(异常)结束
                    return;
                }
                CHCNetSDK.PostMessage(pUserData, 1008, 0, 0);
                //在主线程中发送下一个用户
            }
            return;
        }
        private void ProcessDataSearchCallback(uint dwType, IntPtr lpBuffer, uint dwBufLen, IntPtr pUserData)
        {
            try
            {
                if (dwType == (uint)CHCNetSDK.NET_SDK_CALLBACK_TYPE.NET_SDK_CALLBACK_TYPE_STATUS)
                {
                    MessageData msg = new MessageData();
                    msg.errorcode = 0;
                    uint dwStatus = (uint)Marshal.ReadInt32(lpBuffer);
                    if (dwStatus == (uint)CHCNetSDK.NET_SDK_CALLBACK_STATUS_NORMAL.NET_SDK_CALLBACK_STATUS_FAILED ||
                        dwStatus == (uint)CHCNetSDK.NET_SDK_CALLBACK_STATUS_NORMAL.NET_SDK_CALLBACK_STATUS_EXCEPTION)
                    {
                        msg.searchMsg = SearchMsgType.RECV_FAILIURE;
                        msg.errorcode = (int)CHCNetSDK.NET_DVR_GetLastError();
                        msg.status    = (CHCNetSDK.NET_SDK_CALLBACK_STATUS_NORMAL)dwStatus;
                        this.ProcessData(msg);
                    }
                    else
                    {
                        msg.searchMsg = SearchMsgType.RECV_FINISH;
                        msg.status    = (CHCNetSDK.NET_SDK_CALLBACK_STATUS_NORMAL)dwStatus;
                        this.ProcessData(msg);
                    }
                }
                else if (dwType == (uint)CHCNetSDK.NET_SDK_CALLBACK_TYPE.NET_SDK_CALLBACK_TYPE_DATA)
                {
                    MessageData msg = new MessageData();
                    msg.errorcode = 0;
                    msg.searchMsg = SearchMsgType.RECV_DATA;

                    m_struJsonDataCfg = (CHCNetSDK.NET_DVR_JSON_DATA_CFG)Marshal.PtrToStructure(lpBuffer, typeof(CHCNetSDK.NET_DVR_JSON_DATA_CFG));

                    if (m_struJsonDataCfg.dwJsonDataSize > 3 * 1024 * 1024)
                    {
                        addLog(false, "ProcessData exception json data too long!");
                        MessageData msgFin = new MessageData();
                        msgFin.errorcode = 0;
                        msgFin.searchMsg = SearchMsgType.RECV_FINISH;
                        this.ProcessData(msgFin);
                        return;
                    }

                    byte[] byData = new byte[m_struJsonDataCfg.dwJsonDataSize + 1];
                    Marshal.Copy((IntPtr)m_struJsonDataCfg.lpJsonData, byData, 0, (int)m_struJsonDataCfg.dwJsonDataSize);
                    msg.data           = System.Text.Encoding.UTF8.GetString(byData);
                    msg.dataLen        = (int)m_struJsonDataCfg.dwJsonDataSize;
                    msg.pictureLen     = (int)m_struJsonDataCfg.dwPicDataSize;
                    msg.infraredPicLen = (int)m_struJsonDataCfg.dwInfraredFacePicSize;
                    if (msg.pictureLen != 0 && m_struJsonDataCfg.lpPicData != IntPtr.Zero)
                    {
                        Marshal.Copy((IntPtr)m_struJsonDataCfg.lpPicData, msg.picture, 0, msg.pictureLen);
                    }
                    if (msg.infraredPicLen != 0 && m_struJsonDataCfg.lpInfraredFacePicBuffer != IntPtr.Zero)
                    {
                        Marshal.Copy((IntPtr)m_struJsonDataCfg.lpInfraredFacePicBuffer, msg.infraredPic, 0, msg.infraredPicLen);
                    }
                    // 处理数据并查询下一条数据
                    this.ProcessData(msg);
                }
            }
            catch // System.InvalidOperationException System.ArgumentException
            {
                addLog(false, "ProcessData exception");
                return;
            }
            return;
        }
        private bool SendFaceModify()
        {
            if (-1 == m_lFaceDataRecordHandle)
            {
                return(false);
            }

            if (m_iFaceDataRecordIndex >= m_iFaceDataRecordCount)
            {
                return(false);
            }

            CFaceRecordModify JsonFaceRecordModify = new CFaceRecordModify();

            JsonFaceRecordModify.faceLibType = listViewFaceRecordManage.Items[m_iFaceDataRecordIndex].SubItems[1].Text;
            JsonFaceRecordModify.FDID        = listViewFaceRecordManage.Items[m_iFaceDataRecordIndex].SubItems[2].Text;
            JsonFaceRecordModify.FPID        = listViewFaceRecordManage.Items[m_iFaceDataRecordIndex].SubItems[3].Text;

            string strFaceRecordModify = JsonConvert.SerializeObject(JsonFaceRecordModify);

            IntPtr ptrFaceRecordModify = Marshal.StringToHGlobalAnsi(strFaceRecordModify);

            CHCNetSDK.NET_DVR_JSON_DATA_CFG struJsonDataCfg = new CHCNetSDK.NET_DVR_JSON_DATA_CFG();
            struJsonDataCfg.dwSize         = (uint)Marshal.SizeOf(struJsonDataCfg);
            struJsonDataCfg.lpJsonData     = ptrFaceRecordModify;
            struJsonDataCfg.dwJsonDataSize = (uint)strFaceRecordModify.Length;

            if (!File.Exists(listViewFaceRecordManage.Items[m_iFaceDataRecordIndex].SubItems[4].Text))
            {
                MessageBox.Show("The picture does not exist!");
                Marshal.FreeHGlobal(ptrFaceRecordModify);
                return(false);
            }
            FileStream fs = new FileStream(listViewFaceRecordManage.Items[m_iFaceDataRecordIndex].SubItems[4].Text, FileMode.OpenOrCreate);

            if (0 == fs.Length)
            {
                MessageBox.Show("The picture is 0k,please input another picture!");
                Marshal.FreeHGlobal(ptrFaceRecordModify);
                fs.Close();
                return(false);
            }
            if (200 * 1024 < fs.Length)
            {
                MessageBox.Show("The picture is larger than 200k,please input another picture!");
                Marshal.FreeHGlobal(ptrFaceRecordModify);
                fs.Close();
                return(false);
            }

            struJsonDataCfg.dwPicDataSize = (uint)fs.Length;
            int iLen = (int)struJsonDataCfg.dwPicDataSize;

            byte[] by = new byte[iLen];
            struJsonDataCfg.lpPicData = Marshal.AllocHGlobal(iLen);
            fs.Read(by, 0, iLen);
            Marshal.Copy(by, 0, struJsonDataCfg.lpPicData, iLen);
            fs.Close();

            IntPtr ptrJsonDataCfg = Marshal.AllocHGlobal(Marshal.SizeOf(struJsonDataCfg));

            Marshal.StructureToPtr(struJsonDataCfg, ptrJsonDataCfg, false);

            if (!CHCNetSDK.NET_DVR_SendRemoteConfig(m_lFaceDataRecordHandle, (int)CHCNetSDK.LONG_CFG_SEND_DATA_TYPE_ENUM.ENUM_SEND_JSON_DATA, ptrJsonDataCfg, (uint)Marshal.SizeOf(struJsonDataCfg)))
            {
                ListViewItem listItem = new ListViewItem();
                listItem.Text = "Fail";
                string strTemp = null;
                strTemp = string.Format("Send Fail,FPID:{0}", listViewFaceRecordManage.Items[m_iFaceDataRecordIndex].SubItems[3].Text);
                listItem.SubItems.Add(strTemp);
                this.AddList(listViewMessage, listItem);
                Marshal.FreeHGlobal(ptrFaceRecordModify);
                Marshal.FreeHGlobal(struJsonDataCfg.lpPicData);
                Marshal.FreeHGlobal(ptrJsonDataCfg);
                return(false);
            }
            ListViewItem listItemSucc = new ListViewItem();

            listItemSucc.Text = "Succ";
            string strTempSucc = null;

            strTempSucc = string.Format("Send Processing,FPID:{0}", listViewFaceRecordManage.Items[m_iFaceDataRecordIndex].SubItems[3].Text);
            listItemSucc.SubItems.Add(strTempSucc);
            this.AddList(listViewMessage, listItemSucc);
            Marshal.FreeHGlobal(ptrFaceRecordModify);
            Marshal.FreeHGlobal(struJsonDataCfg.lpPicData);
            Marshal.FreeHGlobal(ptrJsonDataCfg);
            m_iFaceDataRecordIndex++;
            return(true);
        }