这是C++源码里对外的函数和结构体定义,
HikRecordCfgParam* pRecordParam
本人查到是传递结构体的指针
//录像参数配置 typedef struct _tagHikRecordCfgParam { int nType; // 0按时间分包 1,其他按 大小 char szFolder[256]; // 录像存储文件夹 DWORD dwMaxRecordTimes; // 最长录像时长 秒 0 不限制 DWORD dwTimes; // 分包大小 按秒 ULONGLONG dwPackSize; // 分包大小,0则不分包,单位 字节 int nFormatType; // 格式化方式 }HikRecordCfgParam,*LPHikRecordCfgParam; /** @fn HikPt_StartRecord() * @brief 开始预览本地录像 * @param long lSession:预览实例session * @param HikRecordCfgParam pRecordParam:录像配置参数 * @param pPreviewRecordEndCallback pfunrecord:录像结束回调函数,调用HikPt_StopRecord时触发该回调 * @param pUserData:用户数据 * @return int 0 表示成功, 其他表示失败 */ HIKPT_EXTERN int HIKPT_API HikPt_StartRecord(long lSession, HikRecordCfgParam* pRecordParam, pPreviewRecordEndCallback pfunrecord,void* pUserData);
C#定义的结构体和引入声明,报错后找源码发现需要传递的是结构体指针
[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] // [StructLayout(LayoutKind.Sequential, Pack = 1)] /// <summary> /// 开始本地录像结构体 /// </summary> public struct HikRecordCfgParam { [MarshalAs(UnmanagedType.U2)] public int nType; // 0按时间分包1,其他按大小 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)] public byte[] szFolder; // 录像存储文件夹 public int dwMaxRecordTimes; // 最长录像时长秒0 不限制 public int dwTimes; // 分包大小按秒 public long dwPackSize; // 分包大小,则不分包,单位字节 public int nFormatType; // 格式化方式 } /// <summary> /// 开始本地录像 /// </summary> /// <param name="lSession">预览会话实例ID</param> /// <param name="pRecordParam">录像配置参数</param> /// <param name="pfunrecord">录像回调函数</param> /// <param name="pUserData">用户数据</param> /// <returns>0表示成功,其他表示失败</returns> [DllImport("HikPlatformSDK.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern int HikPt_StartRecord(int lSession, MediaClass.HikRecordCfgParam pRecordParam, MediaClass.PRecordBeginCallback pfunrecord, IntPtr pUserData);
解决方案
40
MediaClass.HikRecordCfgParam 前加out或ref试试