描述:
//class CSinkObj
#import "AxisMediaParser.dll" no_namespace named_guids
class ATL_NO_VTABLE CSinkObj :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CSinkObj, &CLSID_SinkObj>,
public IDispatchImpl<ISinkObj, &IID_ISinkObj, &/*LIBID_AxisMediaParserLib*/LIBID_ATLEVNTLib>,
public IDispEventImpl<IDC_SRCOBJ, CSinkObj, &DIID_IAxisMediaParserEvents, &LIBID_AxisMediaParserLib, 1, 0>
{
public:
CSinkObj()
{
}
DECLARE_REGISTRY_RESOURCEID(IDR_SINKOBJ)
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CSinkObj)
COM_INTERFACE_ENTRY(ISinkObj)
COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()
BEGIN_SINK_MAP(CSinkObj)
SINK_ENTRY_EX(IDC_SRCOBJ, DIID_IAxisMediaParserEvents, 1, OnVideoSample32)
END_SINK_MAP()
void __stdcall OnVideoSample32(long CookieID, long SampleType, long SampleFlags, long StartTimeLow, long StartTimeHigh, long StopTimeLow, long StopTimeHigh, const VARIANT& SampleArray)
{
AtlTrace("OnVideoSample\n");
}
}
以下为调用:
HRESULT hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED);
HRESULT hr = m_spSrcObj.CoCreateInstance(OLESTR("AxisMediaParserLib.AxisMediaParser"));
HRESULT hr = CComObject<CSinkObj>::CreateInstance(&m_pSinkObj);
m_pSinkObj->AddRef();
_ASSERTE(SUCCEEDED(hr));
hr = m_pSinkObj->DispEventAdvise(m_spSrcObj);
m_spSrcObj->PutMediaPassword(PASSWORD);
m_spSrcObj->PutMediaURL(URL_PROTOCOL);
m_spSrcObj->PutMediaUsername(LOGIN);
LONG lConnectionCookie; LONG lNumberOfStreams; VARIANT MediaType;
m_spSrcObj->Connect(&lConnectionCookie, &lNumberOfStreams, &MediaType);
long videoCode = 0;
m_spSrcObj->GetVideoCodec(&videoCode);
m_spSrcObj->Start();
调用方法成功,但OnVideoSample32接收不到事件消息.
请大佬指点一下,是不是接收器写得不对,多谢!
解决方案1:
SINK_ENTRY_EX(IDC_SRCOBJ, DIID_IAxisMediaParserEvents, 1, OnVideoSample32) 没有指明OnVideoSample32函数的参数类型
使用SINK_ENTRY_INFO宏
_ATL_FUNC_INFO paraminfo =
{
CC_STDCALL, //calling conv
VT_EMPTY,//返回值
8 ,//参数个数
{VT_I4,VT_I4,VT_I4,VT_I4,VT_I4,VT_I4,VT_I4,VT_VARIANT} //参数类型
};
SINK_ENTRY_INFO(IDC_SRCOBJ, DIID_IAxisMediaParserEvents, 1, OnVideoSample32,¶minfo);
另外注意参数的个数不能超过8,不然没法成功