想把海康流媒体客户端SDK的c++ DEMO(主要是调用了client.dll中的函数)转换为c#。
在client.dll中有个函数HIKS_CreatePlayer(),请问怎么在c#中实现调用该函数?3. CLIENT_API HSESSION __stdcall HIKS_CreatePlayer(IHikClientAdviseSink* pSink, void* pWndSiteHandle,pDataRec pRecFunc, pMsgBack pMsgFunc=0, int TransMethod=0)
作用:创建 Player。pSink 为回调函数集合类指针, pWndSiteHandle 为显示窗口句柄,cfun 为回调函数指针。如果pWndSiteHandle 是否为NULL 表示是否被实时播放,如果pWndSiteHandle 为NULL,表示不被实时播放。pRecFunc 指向处理数据录像的函数,如果pRecFunc 为NULL,表示不录像。pMsgFunc 为消息回调函数句柄,它的功能和第一个参数pSink 表示的回调函数集合的功能一致,只不过采用了不同形式,pMsgFunc 和pSink 不能同时为null。TransMethod表示媒体数据传输的方式,0 表示TCP,1 表示UDP,默认为TCP 传输,但如果在局域网环境下,建议使用UDP。
回调函数:
(i) IHikClientAdviseSink 形式见2.2.2 回调函数集的说明。
(ii) pDataRec typedef int (__stdcall *pDataRec)(int sid, int iusrdata, int idatatype, char* pdata, int ilen)。sid 表示Session ID。iusrdata 暂时无用处。idatatype表示回调上来的数据类型,0 表示头数据,1 表示流媒体数据。pdata 是回调上来的数据的指针。ilen 表示数据的大小。
(iii) pMsgBack typedef int (__stdcall *pMsgBack)(int sid, int opt, int param1,int param2)。Sid 表示SessionID。opt 表示消息类型。param1 和param2 视消息的类型决定其有效性。不同的opt 对应了回调函数集IHikClientAdviseSink 中不同的回调函数:
opt 回调函数 param1 param2
1 OnPosLength nLength 无效
2 OnPresentationOpened success 无效
3 OnPresentationClosed 无效 无效
4 OnPreSeek uOldTime uNewTime
5 OnPostSeek uOldTime uNewTime
6 OnStop 无效 无效
7 OnPause uTime 无效
8 OnBegin uTime 无效
9 OnRandomBegin uTime 无效
10 OnContacting pszHost 无效
11 OnPutErrorMsg pError 无效
12 OnBuffering uFlag uPercentComplete
13 OnChangeRate flag 无效
14 OnDisconnect 无效 无效
返回值:成功返回新建Player 的标示(int 类型,>=0),失败返回-1。在C++的DEMO中调用如下,运行正常:
// clientTestDlg.h : 头文件

class CclientTestDlg : public CDialog, public IhikClientAdviseSink
public:
int m_hSession; //普通情况下表示不同client的句柄
…// clientTestDlg.cpp : 实现文件
void CclientTestDlg::OnBtnPlay()
{
HWND hWnd = GetDlgItem(IDC_STATIC_SHOW)->GetSafeHwnd();
m_hSession = HIKS_CreatePlayer(this, hWnd, NULL, NULL, 0);

}
在C#的DEMO中试着调用如下,出错,说FORM1不能从2个基类继承:public partial class Form1 : Form,IHikClientAdviseSink
{
   public int m_hSession = -1;private void button_play_Click(object sender, EventArgs e)
{
    int hWnd = (int)PlayWin.Handle;
   m_hSession = HKclient.HIKS_CreatePlayer((IHikClientAdviseSink)this, hWnd, null, null, 0);

}

}