C#调用C++写的dll问题
有个C++写的视频服务器的SDK,需要在C#下调用,但是改来改去总是有问题,无法正确采集图像,请大虾们指点一二,谢谢!类型转换上面不知道是不是有问题,但是如果一开始调用初始化函数的时候就会报“尝试读取或写入受保护的内存...”,如果不调用初始化函数,则不报错,但是图像仍然不显示。
需要调用的C++代码
我调用时候的代码
需要调用的C++代码
/// 设备信息
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);
我调用时候的代码
/// <summary>
/// 设备信息
/// H264_DVR_DEVICEINFO,*LPH264_DVR_DEVICEINFO;
/// </summary>
public struct H264_DVR_DEVICEINFO
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
public byte[] sSoftWareVersion; ///< 软件版本信息
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
public byte[] sHardWareVersion; ///< 硬件版本信息
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
public byte[] sEncryptVersion; ///< 加密版本信息
public SDK_SYSTEM_TIME tmBuildTime;///< 软件创建时间
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
public byte[] sSerialNumber; ///< 设备序列号
public Int32 byChanNum; ///< 视频输入通道数
public Int32 iVideoOutChannel; ///< 视频输出通道数
public Int32 byAlarmInPortNum; ///< 报警输入通道数
public Int32 byAlarmOutPortNum; ///< 报警输出通道数
public Int32 iTalkInChannel; ///< 对讲输入通道数
public Int32 iTalkOutChannel; ///< 对讲输出通道数
public Int32 iExtraChannel; ///< 扩展通道数
public Int32 iAudioInChannel; ///< 音频输入通道数
public Int32 iCombineSwitch; ///< 组合编码通道分割模式是否支持切换
public Int32 iDigChannel; ///<数字通道数
public Int32 uiDeviceRunTime; ///<系统运行时间
}
/// <summary>
/// *LPH264_DVR_CLIENTINFO;
/// </summary>
public struct H264_DVR_CLIENTINFO
{
/// <summary>
/// //通道号
/// </summary>
public int nChannel;
/// <summary>
/// //0表示主码流,为1表示子码流
/// </summary>
public int nStream;
/// <summary>
/// //0:TCP方式,1:UDP方式,2:多播方式,3 - RTP方式,4-音视频分开(TCP)
/// </summary>
public int nMode;
/// <summary>
/// //只对组合编码通道有效, 组合编码通道的拼图模式
/// </summary>
public int nComType;
public IntPtr hWnd;
//H264_DVR_CLIENTINFO(IntPtr hWnd)
//{
// hWnd = IntPtr.Zero;
//}
}
/// <summary>
/////服务器断开回调原形
/// typedef void (CALL_METHOD *fDisConnect)(long lLoginID, char *pchDVRIP, long nDVRPort, unsigned long dwUser);
/// </summary>
public delegate void fDisConnect(int lLoginID, string pchDVRIP, int nDVRPort, uint dwUser);
/// <summary>
/////*** */SDK初始化
/// H264_DVR_API long CALL_METHOD H264_DVR_Init(fDisConnect cbDisConnect, unsigned long dwUser);
/// </summary>
[DllImport("netsdk.dll")]
public static extern int H264_DVR_Init(fDisConnect cbDisConnect, uint dwUser);
/// <summary>
/////获取错误信息
/// H264_DVR_API long CALL_METHOD H264_DVR_GetLastError();
/// </summary>
[DllImport("netsdk.dll")]
public static extern int H264_DVR_GetLastError();
/// <summary>
///向设备注册
///H264_DVR_API long CALL_METHOD H264_DVR_Login(char *sDVRIP, unsigned short wDVRPort, char *sUserName, char *sPassword,LPH264_DVR_DEVICEINFO lpDeviceInfo, int *error);
/// </summary>
[DllImport("netsdk.dll")]
public static extern int H264_DVR_Login(string sDVRIP, ushort wDVRPort, string sUserName, string sPassword, ref H264_DVR_DEVICEINFO lpDeviceInfo, IntPtr error);
/// <summary>
///打开实时预览
///H264_DVR_API long CALL_METHOD H264_DVR_RealPlay(long lLoginID, LPH264_DVR_CLIENTINFO lpClientInfo);
/// </summary>
[DllImport("netsdk.dll")]
public static extern int H264_DVR_RealPlay(int lLoginID, ref H264_DVR_CLIENTINFO lpClientInfo);
...全文
相关推荐
VC调用C#写的DLL
这个例子很好解决了, VC和C#之间的互调的问题
C#调用VC++写的DLL(源码,可调试C++的DLL)
C#工程,调用VC++写的DLL 适用于:C#编写界面,核心封装VC代码 可对C++写的代码进行调试模式
c++和c#联合编成.pdf
c++和c#联合编成.pdf
c++和c#联合编成
c++和c#联合编成 c++ wrapper
C#应用调试C++ dll的方法
近碰到个C#应用闪退的问题,由于通讯部分调用了C++工程写的dll,下面介绍一种调试的方法。 右键 启动项目,分别配置常规和和调试即可,如下图。 常规中,输出目录设置为安装目录中dll对应的目录; 调试中命令设置为应用程序(.exe)完整路径;调试类型为“本机”。


