COM组件中客户程序向服务器程序注册失败的原因?

shao 2000-04-13 08:35:00
在客户程序接收器调用服务器接口IConnectionPoint的Advise()向服务器注册时总是失败(拒绝访问),而调用接口IConnectionPoint的其他几个函数时均可成功。而且在本机运行时也可注册成功,在远程调用时出现上述问题。请问如何解决?
...全文
243 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
huitor 2000-04-14
  • 打赏
  • 举报
回复
请查阅微软的bug报告。
Note that both Microsoft Foundation Classes (MFC) and Active Template Library (ATL) have bugs in their IConnectionPoint::Advise implementation. They both do essentially the following:


HRESULT CConnectionPoint::Advise(IUnknown* pUnkSink, DWORD *pdwCookie)
{
IUnknown* p;
HRESULT hRes = S_OK;
if (SUCCEEDED(pUnkSink->QueryInterface(*m_piid, (void**)&p)))
{
// Add p to the list of sinks;
}
else
{
hRes = CONNECT_E_CANNOTCONNECT; // ATL does this
hRes = E_NOINTERFACE; // MFC does this
}
return hRes;
}


The bug is that they should return whatever the QI call returned instead of mapping to CONNECT_E_CANNOTCONNECT or E_NOINTERFACE. The correct way to implement a connection point is roughly the following:

HRESULT CConnectionPoint::Advise(IUnknown* pUnkSink, DWORD *pdwCookie)
{
IUnknown* p;
HRESULT hRes = pUnkSink->QueryInterface(*m_piid, (void**)&p);
if (SUCCEEDED(hRes))
{
// Add p to the list of sinks, maybe returning
// CONNECT_E_ADVISELIMIT if necessary
}
else if (hRes == E_NOINTERFACE)
{
// The sink does not support *m_piid!
return CONNECT_E_CANNOTCONNECT;
}
return hRes;
}

mach 2000-04-13
  • 打赏
  • 举报
回复
试试在你的客户机上设置权限,因为服务端要通过你Advise提供的接口调用客护端.

3,245

社区成员

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

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