Re: parameter problem in fire event
I'm far from an MFC expert, but even I can notice your event
declaration is wrong. You need to use VT_EMPTY instead of
VT_I4 since your event does not have an [out, retval] argument
of type long. Also, your MFC method signature should be of type
void, not HRESULT. Any failures you communicate to MFC by
raising a C++ exception of type COleException* (allocate it with
new - e.g. throw new COleException(...);). Of course it's pointless
to return failures from an event since they will be ignored by the
source object...
You may want to cross-check my reply in the MFC group:
microsoft.public.vc.mfcole
--
=====================================
Alexander Nickolov
Microsoft MVP [VC], MCSD
email: agnickolov@mvps.org
MVP VC FAQ: http://vcfaq.mvps.org
=====================================
"Rohit Kumar" <RohitKumar@discussions.microsoft.com> wrote in message
news:76E8AFAB-3D15-4DCE-BBB7-07724E74966B@microsoft.com...
In my atl service with dual interface, i am calling the callback event in
the
client and passing it a bstr value.
Fire_DownloadComplete(result); where result is a bstr.
this is how my Fire event is defined
HRESULT Fire_DownloadComplete(BSTR res)
{
HRESULT hr = S_OK;
T * pThis = static_cast<T *>(this);
int cConnections = m_vec.GetSize();
for (int iConnection = 0; iConnection < cConnections; iConnection++)
{
pThis->Lock();
CComPtr<IUnknown> punkConnection = m_vec.GetAt(iConnection);
pThis->Unlock();
IDispatch * pConnection = static_cast<IDispatch *>(punkConnection.p);
if (pConnection)
{
CComVariant avarParams[1];
avarParams[0] = res;
avarParams[0].vt = VT_BSTR;
CComVariant varResult;
DISPPARAMS params = { avarParams, NULL, 1, 0 };
hr = pConnection->Invoke(1, IID_NULL, LOCALE_USER_DEFAULT,
DISPATCH_METHOD, ¶ms, &varResult, NULL, NULL);
}
}
return hr;
}
At the client side my sink method is defined as follows.
BEGIN_DISPATCH_MAP(CSink, CCmdTarget)
DISP_FUNCTION(CSink, "DownloadComplete", DownloadComplete, VT_I4 ,
VTS_BSTR)
END_DISPATCH_MAP()
BEGIN_INTERFACE_MAP(CSink, CCmdTarget)//DIID__IXMathEvents
//INTERFACE_PART(CSink, IID_ISink, Dispatch)
INTERFACE_PART(CSink, DIID__IWebLinkHelperEvents, Dispatch)
END_INTERFACE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSink message handlers
HRESULT CSink::DownloadComplete(BSTR res)
{
MessageBox(NULL,"Finished Downloading","Download Status",NULL);
CString result(res);
AfxMessageBox(result);
isDownloadComplete = TRUE;
return S_OK;
}
The callback event is getting called but the correct value of bstr is not
getting passed. I am getting a garbage value. what could be the problem?
Please advice.
Thanks in Advance!