C# 调用非托管dll(海康),函数封送结构体指针参数失败

.Net技术 码拜 8年前 (2016-05-26) 1708次浏览
这是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试试

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C# 调用非托管dll(海康),函数封送结构体指针参数失败
喜欢 (0)
[1034331897@qq.com]
分享 (0)