高分求助!!C#调用C++的SDK
有个C++写的视频服务器的SDK,需要在C#下调用,但是改来改去总是有问题,无法正确采集图像,请大虾们指点一二,谢谢!类型转换上面不知道是不是有问题,但是如果一开始调用初...
有个C++写的视频服务器的SDK,需要在C#下调用,但是改来改去总是有问题,无法正确采集图像,请大虾们指点一二,谢谢!类型转换上面不知道是不是有问题,但是如果一开始调用初始化函数的时候就会报“尝试读取或写入受保护的内存...”,如果不调用初始化函数,则不报错,但是图像仍然不显示。
需要调用的C++代码
C/C++ code
/// 设备信息
typedef struct _H264_DVR_DEVICEINFO
{
char sSoftWareVersion[64]; ///< 软件版本信息
char sHardWareVersion[64]; ///< 硬件版本信息
char sEncryptVersion[64]; ///< 加密版本信息
SDK_SYSTEM_TIME tmBuildTime;///< 软件创建时间
char sSerialNumber[64]; ///< 设备序列号
int byChanNum; ///< 视频输入通道数
int iVideoOutChannel; ///< 视频输出通道数
int byAlarmInPortNum; ///< 报警输入通道数
int byAlarmOutPortNum; ///< 报警输出通道数
int iTalkInChannel; ///< 对讲输入通道数
int iTalkOutChannel; ///< 对讲输出通道数
int iExtraChannel; ///< 扩展通道数
int iAudioInChannel; ///< 音频输入通道数
int iCombineSwitch; ///< 组合编码通道分割模式是否支持切换
int iDigChannel; ///<数字通道数
unsigned int uiDeviceRunTime; ///<系统运行时间
}H264_DVR_DEVICEINFO,*LPH264_DVR_DEVICEINFO;
typedef struct H264_DVR_CLIENTINFO{
int nChannel; //通道号
int nStream; //0表示主码流,为1表示子码流
int nMode; //0:TCP方式,1:UDP方式,2:多播方式,3 - RTP方式,4-音视频分开(TCP)
int nComType; //只对组合编码通道有效, 组合编码通道的拼图模式
void* hWnd;
H264_DVR_CLIENTINFO()
{
hWnd=0;
}
}*LPH264_DVR_CLIENTINFO;
//服务器断开回调原形
typedef void (CALL_METHOD *fDisConnect)(long lLoginID, char *pchDVRIP, long nDVRPort, unsigned long dwUser);
//*** */SDK初始化
H264_DVR_API long CALL_METHOD H264_DVR_Init(fDisConnect cbDisConnect, unsigned long dwUser);
//打开实时预览
H264_DVR_API long CALL_METHOD H264_DVR_RealPlay(long lLoginID, LPH264_DVR_CLIENTINFO lpClientInfo);
有人能回答下不,万分感谢!! 展开
需要调用的C++代码
C/C++ code
/// 设备信息
typedef struct _H264_DVR_DEVICEINFO
{
char sSoftWareVersion[64]; ///< 软件版本信息
char sHardWareVersion[64]; ///< 硬件版本信息
char sEncryptVersion[64]; ///< 加密版本信息
SDK_SYSTEM_TIME tmBuildTime;///< 软件创建时间
char sSerialNumber[64]; ///< 设备序列号
int byChanNum; ///< 视频输入通道数
int iVideoOutChannel; ///< 视频输出通道数
int byAlarmInPortNum; ///< 报警输入通道数
int byAlarmOutPortNum; ///< 报警输出通道数
int iTalkInChannel; ///< 对讲输入通道数
int iTalkOutChannel; ///< 对讲输出通道数
int iExtraChannel; ///< 扩展通道数
int iAudioInChannel; ///< 音频输入通道数
int iCombineSwitch; ///< 组合编码通道分割模式是否支持切换
int iDigChannel; ///<数字通道数
unsigned int uiDeviceRunTime; ///<系统运行时间
}H264_DVR_DEVICEINFO,*LPH264_DVR_DEVICEINFO;
typedef struct H264_DVR_CLIENTINFO{
int nChannel; //通道号
int nStream; //0表示主码流,为1表示子码流
int nMode; //0:TCP方式,1:UDP方式,2:多播方式,3 - RTP方式,4-音视频分开(TCP)
int nComType; //只对组合编码通道有效, 组合编码通道的拼图模式
void* hWnd;
H264_DVR_CLIENTINFO()
{
hWnd=0;
}
}*LPH264_DVR_CLIENTINFO;
//服务器断开回调原形
typedef void (CALL_METHOD *fDisConnect)(long lLoginID, char *pchDVRIP, long nDVRPort, unsigned long dwUser);
//*** */SDK初始化
H264_DVR_API long CALL_METHOD H264_DVR_Init(fDisConnect cbDisConnect, unsigned long dwUser);
//打开实时预览
H264_DVR_API long CALL_METHOD H264_DVR_RealPlay(long lLoginID, LPH264_DVR_CLIENTINFO lpClientInfo);
有人能回答下不,万分感谢!! 展开
2个回答
展开全部
建议你用C#建一个结构体对应C++中用到的结构体,数据类型要一致
然后用到指针的地方可以试试marshal和IntPtr
因为不是很清楚你的项目结构,所以只能给出上面点点建议
然后用到指针的地方可以试试marshal和IntPtr
因为不是很清楚你的项目结构,所以只能给出上面点点建议
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你看看C++上面是怎么用的啊,只要把它改为C#就行了,如果是基本类型用指针的,你可以用IntPtr来代替。如果函数参数是输出的,可以在参数面前加ref或out
追问
请问下,函数参数是输出的话,参数从哪里获得?因为我这个里面的设备信息是作为输出参数的,但是每次运行的时候都为空。
追答
参数是你自己给的,只是在函数里面给你赋值而已。如参数int* n是输出的,那你可以填写ref n,这样函数执行完以后n里面就有值了。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询