今天用IDispEventSimpleImpl(IDispEventImpl)在客户代码中实现了一个回调接口类,但是在运行时造成异常,提示0x80020010 无效的被呼叫方,应google,发现接口类中函数没有使用__stdcall声明,造成了这种异常,随笔记一下,写了下实现代码,供查阅
//Sink.h
extern const IID DIID__IShopStaObjEvents;
extern _ATL_FUNC_INFO ResultInfo;
class CSink : public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CSink>,
public IDispEvent(Simple)Impl<1, CSink, &DIID__IShopStaObjEvents>,
public IUnknown
{
public:
typedef IDispEvent(Simple)Impl<1, CSink, &DIID__IShopStaObjEvents> _baseCls;
BEGIN_COM_MAP(CSink)
COM_INTERFACE_ENTRY_IID(IID_IDispatch, _baseCls)
END_COM_MAP()
BEGIN_SINK_MAP(CSink)
SINK_ENTRY_INFO(1, DIID__IShopStaObjEvents, 1, Pay, &ResultInfo)
END_SINK_MAP()
void __stdcall Pay(LONG lResult)
{
int i=lResult;
i++;
}
};
// Sink.cpp
const IID DIID__IShopStaObjEvents = __uuidof(_IShopStaObjEvents);
_ATL_FUNC_INFO ResultInfo = { CC_STDCALL, VT_EMPTY, 1, {VT_I4}};
//main.cpp
CAppModule _Module;
CComObject<CSink> sink;
int _tmain(int argc, _TCHAR* argv[])
{
_Module.Init(NULL,NULL);
CoInitializeEx(NULL,COINIT_APARTMENTTHREADED);
IShopStaObjPtr spObj;
HRESULT hr;
sink.AddRef();
hr = spObj.CreateInstance(__uuidof(ShopStaObj));
sink.DispEventAdvise(spObj);
spObj->Buy(4);
sink.DispEventUnadvise(spObj);
spObj.Release();
return 0;
}