COM 接收器,接收不到事件信息

samsung99 2009-11-26 05:38:06
//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接收不到事件消息.


请大佬指点一下,是不是接收器写得不对,多谢!
...全文
114 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
samsung99 2009-11-27
  • 打赏
  • 举报
回复
现在是可以接收到事件消息,感谢tttyd(雪影) .

但在 ATLCOM.h 中的
HRESULT hr = DispCallFunc(
&thunk,
0,
info.cc,
info.vtReturn,
info.nParams,
info.pVarTypes,
pVarArgs,
pvarResult);
ATLASSERT(SUCCEEDED(hr));
出错, 网上说ATLCOM.h有BUG,不知是不是这样的,还是程序写得有问题
wshcdr 2009-11-27
  • 打赏
  • 举报
回复
呵呵,我都是手工写,不用这些宏
samsung99 2009-11-27
  • 打赏
  • 举报
回复
终于搞定了,原来是有个数据类型写得不对,查了好几天,惭愧!
static _ATL_FUNC_INFO OnVideoSampleinfo =
{
CC_STDCALL, //calling conv
VT_EMPTY,//返回值
6,//参数个数
{VT_I4,VT_I4,VT_I4,VT_UI8,VT_UI8,VT_ARRAY|VT_I1} //参数类型
};

结帖.
雪影 2009-11-26
  • 打赏
  • 举报
回复
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,不然没法成功

“微信公众平台深度开发Java版 v2.0”系列课程共有6季,使用JAVA语言,系统讲解微信公众平台订阅号、服务号官方列出的全部功能接口,包括:自定义菜单、个性化菜单(按需定制菜单)、群发消息、客服消息(有限次消息推送)、模板消息接(无限次消息推送)、微信网页开发(微信WEB开发、微信游戏)、微信JSSDK开发、用户管理、获取用户基本信息、网页授权获取用户基本信息(通过WEB得到用户信息)、二维码(临时二维码、永久二维码)、事件推送、接收普通消息、被动回复用户消息,等知识点。 以及,针对微信公众号开发的服务端架构设计方案。课程以微信公众号开发视角,讲解JAVA开发微信公众号所需的框架、第三方工具。 购买套餐还赠送经典微信开发课程——[微信公众号_独立知识点]环境搭建。该课程针对各种复杂的网络环境,讲解如何构建开发环境,已解决“没有服务器”、“没有固定IP”等开发者遇到的窘境。 课程采用独立知识点讲解,一个知识点,一组课程,真正做到“简单、高效、”以短的时间、实现的学习。更多课程信息请访问CSDN。网址:http://edu.csdn.net/lecturer/631 “微信公众平台企业号开发Java版”陆续上线。详情 qq2326321088

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧