How to get IErrorInfo from IDispatch call to VB6 component
I'm using this function to call a VB 6 ActiveX component from my VC6 ATL component.
When the VB 6 component throws an exception (raises an error), this is caught in CallByNameEx by the catch(...) exception handler. But when I call GetErrorInfo to get the IErrorInfo pointer, it is returning as NULL. Can anyone help?
Code:
_variant_t CallByNameEx(_bstr_t bstrProgId, _bstr_t bstrProcName, _variant_t* ptrvarParameters, int nParameters)
{
_variant_t varResponse;
HRESULT hr = S_OK;
CLSID clsid;
if (SUCCEEDED(hr = CLSIDFromProgID(bstrProgId, &clsid)))
{
try
{
IUnknownPtr ptrUnknown(clsid);
}
catch(_com_error& e)
{
// Report error
}
IDispatchPtr ptrDispatch = NULL;
if (m_spObjectContext != NULL)
{
hr = m_spObjectContext->CreateInstance(clsid, __uuidof(IDispatch), reinterpret_cast<void**>(&ptrDispatch));
}
else
{
hr = ::CoCreateInstance(clsid, NULL, CLSCTX_ALL, __uuidof(IDispatch), reinterpret_cast<void**>(&ptrDispatch));
}
if (SUCCEEDED(hr) && ptrDispatch != NULL)
{
DISPID dispid;
wchar_t* pszProcName = static_cast<wchar_t*>(bstrProcName);
if (SUCCEEDED(hr = ptrDispatch->GetIDsOfNames(IID_NULL, &pszProcName, 1, LOCALE_USER_DEFAULT, &dispid)))
{
DISPPARAMS dispparams = { ptrvarParameters, NULL, nParameters, 0 };
EXCEPINFO ExcepInfo;
unsigned int uArgErr = 0;
IErrorInfoPtr ptrErrorInfo = NULL;
try
{
if (SUCCEEDED(hr =
ptrDispatch->Invoke(
dispid,
IID_NULL,
LOCALE_USER_DEFAULT,
DISPATCH_METHOD,
&dispparams,
&varResponse,
&ExcepInfo,
&uArgErr)))
{
// Success
}
else
{
// Report error
}
}
catch(...)
{
// FIXME why is ptrErrorInfo == NULL?
if (SUCCEEDED(::GetErrorInfo(0, &ptrErrorInfo)) && ptrErrorInfo != NULL)
{
// Report error
}
else
{
// Report error
}
}
}
}
}
return varResponse;
}