需求:客户在做一个监控系统,要求监控摄像机一旦报警,页面就将摄像机的画面弹出来。
客户端监控摄像机的sdk中要求向其注册一个回调函数,这个回调函数sdk中已经定义好,
一旦摄像机报警就会回调该函数。我打算在这个回调函数中发送一个事件给页面,但是由于
回调函数是静态的,我得不到定义事件的类的指针,因此没有办法调用。我曾经试过建立一个
全局的变量,然后在初始化回调函数的时候将this指针传递给全局变量,然后在静态回调
函数中取。当回调函数被调用的时候,不能通过我之前保存的类指针去调用事件函数,不知道
是不是跟线程有关系。也就是说执行回调函数的线程和我保存类指针的线程不一样。
static CMonitorAlarmCtrl *_ctrl = NULL;STDMETHODIMP CMonitorAlarmCtrl::InitServers()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState()) // TODO: Add your implementation code here
//Fire_FireAlarm(::SysAllocString(L"10.17.80.211"), ::SysAllocString(L"0"));  //可以调用
GetServerIpAddress();

for (int i = 0; i < m_iServersCount; i++)
{  NVNET_LogonServer("10.17.80.211", 4000, "admin", "admin", NULL, &m_hServers[i]);  //连接监控摄像机
  NVNET_SetCallback(m_hServers[i], MsgCallback);//注册回调函数 }
_ctrl = this;
//_ctrl->Fire_FireAlarm(::SysAllocString(L"10.17.80.211"), ::SysAllocString(L"0"));  //这样是可以发送事件的
//MsgCallback(NULL, NULL);  //这样也可以调用。也就是说不通过监控摄像机来回调,我自己调用可以运行
return S_OK;
}int CMonitorAlarmCtrl::MsgCallback(HANDLE hServer,NVNET_SERVER_MSG *pMsg)
{
        //自己调用可以执行,监控摄像机调用就执行不了了。不知道为什么。
AfxMessageBox("abd");
//AfxMessageBox((long)_ctrl);
        if (_ctrl != NULL)
        {
    _ctrl->Fire_FireAlarm(::SysAllocString(L"10.17.80.211"), ::SysAllocString(L"0"));   //这段代码是可以进入的,也就是说_ctrl 确实不为空,我跟奇怪为什么不为空也调用不了。
        } return 0;
}