您的位置:首页 > 其它

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

2014-01-18 02:03 826 查看
今天用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;
}


PS. 经调试发现,注释掉语句sink.DispEventUnadvise(spObj)后,spObj执行Release时对象依然会被释放,所以个人认为挂载回调接口不会增加com对象的计数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐