描述:
我写的连接点实现的客户端程序,下面是接收器类的.h和.cpp。编译运行,跟踪发现
// EventSink.h : Declaration of the CEventSink
/////////////////////////////////////////////////////////////////////////////
// CEventSink
class ATL_NO_VTABLE CEventSink :
public IDispEventImpl<1, CEventSink,&DIID__ISpeakEvents,&LIBID_MY050104ATLLib, 1, 0>
{
public:
CEventSink()
{
}
public:
public:
BEGIN_SINK_MAP(CEventSink)
SINK_ENTRY_EX(1, DIID__ISpeakEvents, 1, OnSay)
END_SINK_MAP()
void __stdcall OnSay(long aVal); //没有参数的情况
// IEventSink
};
// EventSink.cpp : Implementation of CEventSink
#include "stdafx.h"
#include "050104MFCwithATL.h"
#include "EventSink.h"
/////////////////////////////////////////////////////////////////////////////
// CEventSink
void __stdcall CEventSink::OnSay(long aVal)
{
AfxMessageBox("called by Event from dll Server !");
}
客户端调用代码:
IUnknown *pUnk;
LRESULT hResult = m_Dispatch->QueryInterface(IID_ISpeak,(void**)&pUnk);
if (hResult == S_OK)
{
pEventSink->DispEventAdvise(pUnk);
}
m_Dispatch是对话用来保存服务器自动化接口指针的,这个指针有效,调用该接口的方法都没问体。不过DispEventAdvise(pUnk)出现问题,跟踪发现,代码执行到服务器端的Advise时,它要调用pEventSink->QueryInterface(..),就是检查接收器的IUnknown指针是否有效,发现pEventSink(就是传到服务器端的pUnk)它的虚表时空的,就是说没有QueryInterce的实现,怎么回事?不是派生自
public IDispEventImpl<1, CEventSink,&DIID__ISpeakEvents,&LIBID_MY050104ATLLib, 1, 0>,这个基类已经实现了基本的com接口麽?或者是其他方面的问题?
解决方案1:
加入
BEGIN_COM_MAP(CEventSink )
COM_INTERFACE_ENTRY(IID_ISpeakEvents)
END_COM_MAP()