紧急求助:ATL客户与COM组件建立连接点成功,但是无法响应该连接点上的事件

blackdancer 2007-04-11 05:44:20
CUPSvr是进程外的COM组件,ATL客户是一个.EXE,接收类名为CSUCtrlSink,连接点为m_pISuCtrlConnectionPoint,对应于接口_IUPSvrEvents.
在客户程序中首先创建了一个对话框类CSUCtrlDlg,而后直接执行该对话框类的Initialize方法,其代码如下:
bool CSUCtrlDlg::Initialize()
{
//create COM object of CSuCtrlSink
m_pSuCtrlSink = new CComObject<CSUCtrlSink>;

HRESULT hr;
IUnknown* pUnk = NULL;
IConnectionPointContainer* pConnPtContainer = NULL;

hr = m_UpCtrl.CoCreateInstance(__uuidof(CUPSvr));

hr = m_UpCtrl->QueryInterface(IID_IConnectionPointContainer, (void**)&pConnPtContainer);

hr = pConnPtContainer->FindConnectionPoint(__uuidof(_IUPSvrEvents), &m_pISuCtrlConnectionPoint);

CComPtr<IUnknown>spUnk;
m_pSuCtrlSink->QueryInterface(IID_IUnknown, (LPVOID *)&spUnk);

hr = m_pISuCtrlConnectionPoint->Advise(spUnk, &m_dwCookie);

return true;
}
Debug时发现Advise返回S_OK, 而且m_dwCookie=1,但是对于_IUPSvrEvents上的事件,客户程序就是无法响应。
后来看到网上说需要指定客户程序的事件处理函数和连接点上的事件的对应关系,于是在接收类中添加了如下代码
BEGIN_SINK_MAP(CSUCtrlSink)
SINK_ENTRY_EX(0,__uuidof(_IUPSvrEvents), 1, UploadingStarted)
END_SINK_MAP()
但在这种情况下,链接时会出现如下错误:
error C2440: 'static_cast' : cannot convert from '_atl_event_classtype *' to 'ATL::_IDispEventLocator<nID,piid> *'

请大虾们帮忙看看,实在搞不定了,多谢多谢!
...全文
560 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
hbuzzd 2008-09-16
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 samsun2000 的回复:]
你这里搞错了
CComPtr <IUnknown> spUnk;
m_pSuCtrlSink-> QueryInterface(IID_IUnknown, (LPVOID *)&spUnk);

hr = m_pISuCtrlConnectionPoint-> Advise(spUnk, &m_dwCookie);

应该是:
CComPtr <IUnknown> spUnk;
m_pISuCtrlConnectionPoint-> QueryInterface(IID_IUnknown, (LPVOID *)&spUnk);

m_pSuCtrlSink-> Advise(spUnk, &m_dwCookie);

因为2个对象Advise方法参数不同,所以报那…
[/Quote]
对了,Advise方法为注册调用接口指针,必须用外部的接收器对象指针。

其次如果还有其他的问题你可以用MessageBox()在服务端ExE中跟踪显示一下。
joyjjjz 2008-09-12
  • 打赏
  • 举报
回复
我也碰到 error C2440, 把下边的0换成资源id, ok
SINK_ENTRY_EX(0,__uuidof(_IUPSvrEvents), 1, UploadingStarted)
samsun2000 2007-05-23
  • 打赏
  • 举报
回复
你这里搞错了
CComPtr<IUnknown>spUnk;
m_pSuCtrlSink->QueryInterface(IID_IUnknown, (LPVOID *)&spUnk);

hr = m_pISuCtrlConnectionPoint->Advise(spUnk, &m_dwCookie);

应该是:
CComPtr<IUnknown>spUnk;
m_pISuCtrlConnectionPoint->QueryInterface(IID_IUnknown, (LPVOID *)&spUnk);

m_pSuCtrlSink->Advise(spUnk, &m_dwCookie);

因为2个对象Advise方法参数不同,所以报那个连接错误
wshcdr 2007-05-22
  • 打赏
  • 举报
回复
http://www.vckbase.com/document/viewdoc/?id=1538
broccoli 2007-05-21
  • 打赏
  • 举报
回复
MARK
blackdancer 2007-04-13
  • 打赏
  • 举报
回复
我在_IUPSvrEvents接口上添加了两个method,fun1和fun2,dispid分别是1和2,然后选择实现连接点后自动生成了回调辅助函数Fire_fun1和Fire_fun2,对应dispid分别指定为1和2,不知道这里有什么问题呢,dispid怎么会指定不对呢?
firmbird 2007-04-13
  • 打赏
  • 举报
回复
dispid指定不对
wwwasdf5 2007-04-13
  • 打赏
  • 举报
回复

给大家介绍个技术群

大家一起学习,一起提高

21189212
blackdancer 2007-04-13
  • 打赏
  • 举报
回复
跟进去看了一下,发现在服务组件invoke是返回的是“member not found", 但是我在接收类上实现了该接口阿,太奇怪了。。。
内容概要:本文围绕“考虑用户侧柔性负荷的社区综合能源系统优化调度”展开研究,基于Matlab代码实现,构建了涵盖电、热等多种能源形式耦合的社区级综合能源系统模型。研究重点在于将用户侧具有可调节特性的柔性负荷纳入优化框架,通过建立以经济性和低碳性为目标的优化调度模型,结合YALMIP等优化工具调用Cplex求解器进行求解,在保障用户用能需求的前提下,提升系统对可再生能源的消纳能力,降低综合用能成本,并增强系统运行的灵活性与智能化水平。该研究为社区能源系统的高效、可持续运行提供了可复现的技术方案与仿真验证路径。; 适合人群:具备电力系统、能源系统等相关专业知识基础,熟悉Matlab编程环境与基本优化建模方法的研究生、科研人员及从事能源领域技术研发的工程技术人员。; 使用场景及目标:①用于高校及科研机构开展综合能源系统、需求侧应、柔性负荷建模等方向的课题研究与算法验证;②为城市社区、产业园区等实际场景的能源管理系统开发提供优化算法支持与案例参考;③帮助研究人员深入掌握多能流协同优化、YALMIP/Cplex应用、日前调度建模及柔性负荷应机制的代码实现方法。; 阅读建议:建议读者结合提供的Matlab代码实例,逐步搭建并调试仿真模型,重点关注目标函数的设计逻辑、各类物理约束(如功率平衡、设备出力、储能动态等)的数学表达以及柔性负荷参与调度的建模方式,可进一步拓展至不确定性优化、多时间尺度调度等进阶场景进行深化研究。

3,248

社区成员

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

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