在c++里面回调函数是这样定义的:
static int WINAPI  ChannelStreamCallback(HANDLE hOpenChannel,void *pStreamData,DWORD dwClientID,void *pContext,ENCODE_VIDEO_TYPE encodeVideoType,HHAV_INFO *pAVInfo);在另外个函数HHNET_OpenChannel(szRegisterIP,wRegisterDataPort,(char *)(const char *)m_sDeviceName,(char *)(const char *)m_sUserName,char *)(const char *)m_sUserPsw,(HHOPEN_CHANNEL_INFO *)&openInfo_ex,m_pCurrentNode->hOpen)中,openInfo_ex是一个结构,结构中的一个成员是回调函数
openInfo_ex.funcStreamCallback = ChannelStreamCallback
实际被回调的函数:
int
WINAPI 
CSDKDemoDlg::ChannelStreamCallback(HANDLE hOpenChannel,void *pStreamData,DWORD dwClientID,void *pContext,ENCODE_VIDEO_TYPE encodeVideoType,HHAV_INFO *pAVInfo)
{        
//callback function
WORD wDisplayWnd = (WORD)pContext;   //播放器编号
DWORD dwFrameSize = 0;
HV_FRAME_HEAD *pFrameHead = (HV_FRAME_HEAD *)pStreamData; int  ret = 0;
ASSERT(pFrameHead); HHERR_CODE  errCode = HHERR_SUCCESS;
dwFrameSize = sizeof(HV_FRAME_HEAD) + pFrameHead->nByteNum;
//送播放库显示
ret = HH5PLAYER_PutDecStreamDataEx(
wDisplayWnd,      //播放器编号
(BYTE *) pStreamData, 
dwFrameSize, 
encodeVideoType,
(HH5KAV_INFO *)pAVInfo);
}我在c#中,是这样写的:
public delegate int ChannelStreamCallback(IntPtr hOpenChannel, IntPtr pStreamData, ulong dwClientID, IntPtr pContext, ENCODE_VIDEO_TYPE encodeVideoType,ref KTAV_INFO pAVInfo);ChannelStreamCallback CSCallback;
CSCallback = new ChannelStreamCallback(ChannelStreamCallback1);
OpenChannelInfo.funcStreamCallback = CSCallback;
HHNET_OpenChannel(ip, nPort, devicename, username, password,ref OpenChannelInfo, out server, wHnd);public int ChannelStreamCallback1(IntPtr hOpenChannel, IntPtr pStreamData, ulong dwClientID, IntPtr pContext, ENCODE_VIDEO_TYPE encodeVideoType, ref KTAV_INFO pAVInfo)
        {
            ushort wDisplayWnd = Convert.ToUInt16(pContext);
            ulong dwFrameSize=0;
            hOpenChannel = this.Handle;
            HV_FRAME_HEAD pFrameHead = new HV_FRAME_HEAD();
            Marshal.StructureToPtr(pFrameHead, pStreamData, false);
            int rect = 0;            dwFrameSize = Convert.ToUInt64(Marshal.SizeOf(pFrameHead)) + pFrameHead.nByteNum;
            rect=Camera.KT5PLAYER_PutDecStreamDataEx(wDisplayWnd, (byte)pStreamData, dwFrameSize, (uint)encodeVideoType,pAVInfo);
            return 0;
        }
补充说明:HV_FRAME_HEAD、ENCODE_VIDEO_TYPE、KTAV_INFO都是结构,我已经通过调试其他相关函数证明这些结构的转换没有问题了。HHNET_OpenChannel函数成功调用并且返回值说明工作正常,但是委托的函数的作用却没有体现出来,感觉委托函数根本就没有被调用,我在委托的函数中尝试加入MessageBox.show()进行调试,并没有出现任何提示,不知道是因为回调函数转换成委托的过程中数据类型有错还是其他什么原因,跪求高手帮忙解决,谢谢了!

解决方案 »

  1.   

    纠正一下:ChannelStreamCallback1中的“hOpenChannel = this.Handle; “去掉。
      

  2.   

    自己顶一下,KT5PLAYER_PutDecStreamDataEx这个函数的参数类型转换貌似有问题,
    c++:
    DLLEXPORT_API int __stdcall HH5PLAYER_PutDecStreamDataEx(USHORT nPort,PBYTE pBuf, DWORD nSize, UINT nDataType, HH5KAV_INFO *pAVInfo);
    c#:
    [DllImport("kt5PlayerSDK.dll", EntryPoint = "HH5PLAYER_PutDecStreamData", CharSet = CharSet.Unicode)]
    public static extern int KT5PLAYER_PutDecStreamDataEx(ushort nPort, UInt16 pBuf, ulong nSize, uint nDataType, IntPtr pAVInfo);
      

  3.   

    不知对不对。
    [DllImport("kt5PlayerSDK.dll", EntryPoint = "HH5PLAYER_PutDecStreamData", CharSet = CharSet.Unicode)] 
    public static extern int KT5PLAYER_PutDecStreamDataEx(ushort nPort, IntPtr pBuf, ulong nSize, uint nDataType, IntPtr pAVInfo);
      

  4.   

    也不表明参数是In还是out还是inout
    叫人猜谜啊
    猜一个先 
    PBYTE pBuf找个是in的数组吧,byte[]即可