今天用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;
}
本文通过一个具体的案例,探讨了在使用IDispEventSimpleImpl实现COM回调接口时遇到的0x80020010异常问题。作者发现未使用__stdcall声明是导致异常的原因,并分享了修正后的代码实现。
1万+

被折叠的 条评论
为什么被折叠?



