How to catch an exception?
Hello,
I have a VC++ client that attaches to a COM server via CreateDispatch(). I
then get an object from the COM server via a function called
GetItemDocument(long nItem);
If the document doesn't exist, an exception is thrown, and here is my
problem. I can't catch the exception!
Instead I wind up in AfxCallWndProc() (wincore.cpp) in the CATCH_ALL(e)
statement!??
Params are
pWnd = 0x0012fc0c {CVCClientDlg hWnd=0x0005101e}
hWnd = 0x0005101e {unused=??? }
nMsg = 273
wParam = 1002
lParam = 331804
The AfxProcessWndProcException will show a messagebox with Type mismatch.
This is the output:
Warning: automation return value coercion failed.
Warning: constructing COleException, scode = DISP_E_TYPEMISMATCH
($80020005).
First-chance exception at 0x7c812a5b in VCClient.exe: Microsoft C++
exception: COleException at memory location 0x0012ef30..
Warning: Uncaught exception in WindowProc (returning 1).
My calling code looks like this:
LPDISPATCH lpDisp = NULL;
try
{
lpDisp = m_project.GetItemDocument(0); // here i exit to AfxCallWndProc()
}
catch(COleException &ex)
{
ex.ReportError()
}
catch(CException &ex)
{
ex.ReportError();
}
What I want is to catch the exception so that I can handle it the way it
should be handled!
How do I do this??
// Anders
--
English is not my first, or second, language
so anything strange, or insulting, is due to
the translation.
Please correct me so I may improve my English!
PS! The COM server is not written by me, but I have got a copy of the
source (it's not possible for me to change anything in it) so the
GetItemDocument() looks like this:
LPDISPATCH CProjectDispatch::GetItemDocument(long nItem)
{
ASSERT(m_pMyProject != NULL);
int nCount = m_pMyProject->GetItemsCount();
CLaserDoc* pLaserDoc = (nItem >= 0 && nItem < nCount) ?
m_pMyProject->m_arrayProjectItems[nItem]->GetDocument() : NULL;
// Throw an dummy OLE exception to break COleDispatchImpl::Invoke() call
letting
// the VARIANT result set to VT_EMPTY
if(pLaserDoc == NULL)
AfxThrowOleException(S_OK);
return pLaserDoc ? pLaserDoc->GetIDispatch(TRUE) : NULL;
}