实现Com连接点产生异常(0x80020010 无效的被呼叫方)解决办法

来源:互联网 发布:加工中心半圆编程范例 编辑:程序博客网 时间:2024/05/17 01:28

今天用IDispEventSimpleImpl(IDispEventImpl)在客户代码中实现了一个回调接口类,但是在运行时造成异常,提示0x80020010 无效的被呼叫方,应google,发现接口类中函数没有使用__stdcall声明,造成了这种异常,随笔记一下,写了下实现代码,供查阅

//Sink.hextern 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.cppconst IID DIID__IShopStaObjEvents = __uuidof(_IShopStaObjEvents);_ATL_FUNC_INFO ResultInfo = { CC_STDCALL, VT_EMPTY, 1, {VT_I4}};


 

//main.cppCAppModule _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;}


 

PS. 经调试发现,注释掉语句sink.DispEventUnadvise(spObj)后,spObj执行Release时对象依然会被释放,所以个人认为挂载回调接口不会增加com对象的计数。
0 0
原创粉丝点击