我已经浪费了300分了,不过还是想知道在vc调com的时候怎么响应连接点?

a_ray1 2001-11-29 08:49:07
各位帮帮忙别让我这次也把份浪费了!谢谢了!
...全文
102 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zheng_rui 2001-11-29
  • 打赏
  • 举报
回复
比较简单:
首先加入atl支持
然后实现一个eventhander:

class CClickerEventHandler :
public IDispEventImpl<1, CClickerEventHandler,&DIID__IClickItEvents,&LIBID_CLICKERLib, 1, 0>
{
public:

BEGIN_SINK_MAP(CClickerEventHandler)
SINK_ENTRY_EX(1, DIID__IClickItEvents, 1, OnCtrlMouseClick)
SINK_ENTRY_EX(1, DIID__IClickItEvents, 2, OnCtrlMouseMove)
SINK_ENTRY_EX(1, DIID__IClickItEvents, 3, OnCtrlError)
END_SINK_MAP()
CClickerClientDlg* m_Parent;

CClickerEventHandler(CClickerClientDlg* parent)
{
m_Parent = parent;
}
void __stdcall OnCtrlMouseClick(long x, long y)
{
m_Parent->OnCtrlMouseClick(x, y);
}

void __stdcall OnCtrlMouseMove(long x, long y)
{
m_Parent->OnCtrlMouseMove(x, y);
}

void __stdcall OnCtrlError(BSTR errorMsg)
{
char msg[128];
WideCharToMultiByte(CP_ACP, 0, errorMsg, -1, msg, sizeof(msg), NULL, NULL);
m_Parent->OnCtrlError(msg);

}

};
然后
在主程序中
ceh = new CClickerEventHandler(this);
IUnknown* pUnk = GetDlgItem(IDC_CLICKIT)->GetControlUnknown();
if(ceh && SUCCEEDED(pUnk->QueryInterface(IID_IClickIt, (void**) &spclicker)))
{
ceh->DispEventAdvise(spclicker);
}

释放:
if(spclicker)
{
ceh->DispEventUnadvise(spclicker);
spclicker->Release();
}
if(ceh)
delete ceh;

里面的id是剧烈
Bottol 2001-11-29
  • 打赏
  • 举报
回复
1.client向source object查询IConnectionPointContainer接口。这意味着所有的可连接对象(源对象)必须实现IConnectionPointCotainer接口,如果一个对象没有实现IConnectionPointCotainer,他就不能发出任何消息(event)
2.如果QueryInterface成功,client传递他想接受的event接口的IID(IConnectionPointContainer::FindConnectionPoint)。如果可连接对象提供这个接口,他就会返回一个连接点对象的接口的指针。或者由client调用IConnectionPointContainer::EnumConnectionPoints来获得一个枚举对象(enumerator),这样他就可以检查所有的被提供的连接点(并看看他们能不能被使用)
3.假设我们获得了一个连接点的指针,client在这个接口上调用IConnectionPoint::Advise,传递一个指向将最终接受event的mini-object的IUnkonow指针。Client将负责保存从Advise返回的cookie值。
4.在这个连接点上,client将接受接口指针传来的event。
5.当他想停止接受events的时候(比如他要shuts down的时候),就调用IConnectionPoint::Unadvise,并把在第三步保存的cookie值传给他

MSDN上有比较详细的说明,还有一个用VC写的office com addins例子,里面用到连接点,下载再来看看。
Bottol 2001-11-29
  • 打赏
  • 举报
回复
1。client向source object查询IConnectionPointContainer接口。这意味着所有的可连接对象(源对象)必须实现IConnectionPointCotainer接口,如果一个对象没有实现IConnectionPointCotainer,他就不能发出任何消息(event)
2。如果QueryInterface成功,client传递他想接受的event接口的IID(IConnectionPointContainer::FindConnectionPoint)。如果可连接对象提供这个接口,他就会返回一个连接点对象的接口的指针。或者由client调用IConnectionPointContainer::EnumConnectionPoints来获得一个枚举对象(enumerator),这样他就可以检查所有的被提供的连接点(并看看他们能不能被使用)
3。假设我们获得了一个连接点的指针,client在这个接口上调用IConnectionPoint::Advise,传递一个指向将最终接受event的mini-object的IUnkonow指针。Client将负责保存从Advise返回的cookie值。
4。在这个连接点上,client将接受接口指针传来的event。
5。当他想停止接受events的时候(比如他要shuts down的时候),就调用IConnectionPoint::Unadvise,并把在第三步保存的cookie值传给他

MSDN里面有更详细的说明,还有一个用VC写的office com addins例子,里面用到连接点,下载下来看看。
a_ray1 2001-11-29
  • 打赏
  • 举报
回复
有些com支持连接点可以让客户端产生事件,可是如何编写客户端响应事件。谢谢了。
shesh 2001-11-29
  • 打赏
  • 举报
回复
说仔细些.

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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