如何将下例的视频回调函数转成C#的????typedef void (CALLBACK *PrcVidMpegCallBack)(DWORD dwCard, BYTE *pbuff, DWORD dwSize,BOOL isKeyFrm)
/*说明: 视频MPEG压缩数据回调.参数: dwCard: 返回的卡号.Pbuff: 视频MPEG数据的指针dwSize: 视频MPEG数据缓冲区大小,单位字节isKeyFrm: 是否使用关键帧返回值:无
*/
/*说明: 视频MPEG压缩数据回调.参数: dwCard: 返回的卡号.Pbuff: 视频MPEG数据的指针dwSize: 视频MPEG数据缓冲区大小,单位字节isKeyFrm: 是否使用关键帧返回值:无
*/
/// 视频MPEG压缩数据回调.
/// </summary>
/// <param name="dwCard">返回的卡号.</param>
/// <param name="pbuff">视频MPEG数据的指针</param>
/// <param name="dwSize">视频MPEG数据缓冲区大小,单位字节</param>
/// <param name="isKeyFrm">是否使用关键帧</param>
delegate void PrcVidMpegCallBack(uint dwCard,[MarshalAs(UnmanagedType.LPArray)]byte[] pbuff,uint dwSize,bool isKeyFrm);
试试看
{ }
private void button1_Click(object sender, EventArgs e)
{
PrcVidMpegCallBack _CallBack= new PrcVidMpegCallBack(MpegCallBack);
}不知道对不对..
DWORD类型是不是就是数值类型Long?WORD呢?能不能直接把一个int类型赋值给DWORD?
long是有符号类型 DWORD(双字)是为了兼容性考虑定义的,目前就是unsigned long,一个int类型的数值可以直接赋给DWORD, 不过注意DWORD是没有负数的.负的int到DWORD转换时会被转换为一个最高位为1的DWORD数(越说越乱)
/// <summary>
/// 视频MPEG压缩数据回调
/// </summary>
/// <param name="dwCard"></param>卡号
/// <param name="pbuff"></param>视频MPEG数据
/// <param name="dwSize"></param>视频MPEG数据缓冲区大小,单位字节
/// <param name="isKeyFrm"></param>是否使用关键帧
[DllImport("Sa7134Capture.dll", EntryPoint = "PrcVidMpegCallBack")]
public extern static void PrcVidMpegCallBack(Int32 dwCard, [MarshalAs(UnmanagedType.LPArray)]byte[] pbuff, Int32 dwSize, bool isKeyFrm);//可以通过..
//public delegate void PrcVidMpegCallBack(Int32 dwCard, [MarshalAs(UnmanagedType.LPArray)]byte[] pbuff, Int32 dwSize, bool isKeyFrm);// 编译通不过...
#endregion
这里还有一个不知道怎么改????
BOOL WINAPI VCARegVidMpegCallBack( DWORD dwCard, PrcVidMpegCallBack ppCall )说明: 注册视频MPEG压缩数据回调.参数: dwCard: 卡号.ppCall: 需要注册的回调函数指针返回值:TRUE: 成功FALSE: 失败.
完整代码应该像这样:
/// <summary>
/// 视频MPEG压缩数据回调.
/// </summary>
/// <param name="dwCard">返回的卡号.</param>
/// <param name="pbuff">视频MPEG数据的指针</param>
/// <param name="dwSize">视频MPEG数据缓冲区大小,单位字节</param>
/// <param name="isKeyFrm">是否使用关键帧</param>
public delegate void PrcVidMpegCallBack(uint dwCard, [MarshalAs(UnmanagedType.LPArray)]byte[] pbuff, uint dwSize, bool isKeyFrm); [DllImport("Sa7134Capture.dll")]
public extern static bool VCARegVidMpegCallBack(uint dwCard, PrcVidMpegCallBack ppCall); public void PrcVidMpeg(uint dwCard, [MarshalAs(UnmanagedType.LPArray)]byte[] pbuff, uint dwSize, bool isKeyFrm)
{
//这个方法需要你自己实现,以供C++回调
} //使用
void SomeMethod()
{
uint dwCard=0;//看具体情况
bool result = false;
result = VCARegVidMpegCallBack(dwCard, new PrcVidMpegCallBack(PrcVidMpeg));
}