这是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试试