Здравствуйте natalka, Вы писали:
N>Здравствуйте OlegO, Вы писали:
OO>>Чтобы понять, что происходит достаточно посмотреть .CPP файл, которые сгенерила студия,
OO>>для твоего ActiveX.
OO>>В методах идет вызов метода CWnd::InvokeHelper, а он в случае ошибки генерит
OO>>исключения COleException если код ошибки равен DISP_E_EXCEPTION, или
OO>>COleDispatchException в остальных случаях.
OO>>для простоты можешь перехватывать все исключения catch(...)
OO>>Если исключения не приходят, значит смотри код ActiveX'а
N>когда я по шагам смотрела, что происходит, он мне показывает, что в методе у меня появляется исключение типа COleDispatchException
N>В другом клиенте я получаю ошибку другим способом (этот приём везде описан):
N> hr = pInterface->QueryInterface(IID_ISupportErrorInfo,(void**)&pISER);
N> if(SUCCEEDED(hr))
N> {
N> if(SUCCEEDED(pISER->InterfaceSupportsErrorInfo(riid)))
N> {
N> IErrorInfo *pEI;
N> if (SUCCEEDED(GetErrorInfo(NULL,&pEI)))
N> {
N> BSTR desc;
N> pEI->GetDescription(&desc);
N> char buff[80];
N> WideCharToMultiByte(CP_ACP,NULL,desc,-1,buff,80,NULL,NULL);
N> cout << buff << endl;
N> SysFreeString(desc);
N> pEI->Release();
N> }
N> }
N> pISER->Release();
N> }
N> pInterface->Release();
N>и там все работает, но мне для простоты написания клиента нужен catch.
N>Сейчас у меня как раз исключение и ловиться на catch(...), но мне надо конкретно.
А что тебе мешает ловить так
try
{
...
}
catch(COleException *e)
{
char buf[1024]; // For the Try...Catch error message.
sprintf(buf, "COleException. SCODE: %08lx.", (long)e->m_sc);
::MessageBox(NULL, buf, "COleException", MB_SETFOREGROUND | MB_OK);
}
catch(COleDispatchException *e)
{
char buf[1024]; // For the Try...Catch error message.
sprintf(buf,
"COleDispatchException. SCODE: %08lx, Description: \"%s\".",
(long)e->m_wCode,(LPSTR)(LPCTSTR)e->m_strDescription);
::MessageBox(NULL, buf, "COleDispatchException",
MB_SETFOREGROUND | MB_OK);
}
catch(...)
{
::MessageBox(NULL, "General Exception caught.", "Catch-All",
MB_SETFOREGROUND | MB_OK);
}