描述:
参考杨老师的资料和代码重新写了个关于COM组件事件/通知的示例程序,编译通过,但是运行报错!搞了一天没有解决!希望高手们指点下:
HRESULT hr = m_spCom.CreateInstance(__uuidof(EventAdvise));
if(FAILED(hr))
{
AfxMessageBox(_T("注册了吗?COM初始化了吗?"));
CDialog::OnCancel();
}
m_dwCookie = 0;
m_Sink.SetResultWnd(&m_Edit);
// 把接收器接口指针,传递到组件中。实现“连接”
hr = m_spCom->Advise(&m_Sink, (long*)&m_dwCookie);
运行到实现连接就报错!
Unhandled exception in UseEvent.exe(KERNEL32.DLL):0XE06D7363 :Microsoft c++ Exception
解决方案1:
在服务器端使用ICallBack接口写回调函数,添加回调方法 Fire_OnXX开头的,还有回调计数器Advise() UnAdvise()
然后在客户端写接收器类 Sink_ 继承ICallBack
再在实现回调处理函数raw_Fire_OnXX
调用的时候 首先在客户端程序中调用Advise,设置回调接口类Sink_ 的ICallBack指针
然后 在服务器端需要的时候调用Fire_On就OK了
hResult = CoCreateInstance(sourceobjCLSID, NULL,
CLSCTX_INPROC_SERVER, IID_IDispatch, (void **)&m_pDispatch);
if (FAILED(hResult))
{
return FALSE;
}
BOOL RetValue = 0;
if (m_dwCookie != 0) {
return 2;
}
LPCONNECTIONPOINTCONTAINER pConnPtCont;
if ((m_pDispatch != NULL) &&
SUCCEEDED(m_pDispatch->QueryInterface(IID_IConnectionPointContainer,
(LPVOID*)&pConnPtCont)))
{
ASSERT(pConnPtCont != NULL);
LPCONNECTIONPOINT pConnPt = NULL;
DWORD dwCookie = 0;
if (SUCCEEDED(pConnPtCont->FindConnectionPoint(IID_IEventSet, &pConnPt)))
{
ASSERT(pConnPt != NULL);
pConnPt->Advise(&m_xEventSink, &dwCookie);
m_dwCookie = dwCookie;
RetValue = 1;
pConnPt->Release();
}
pConnPtCont->Release();
m_dwCookie = dwCookie;
}