Re[5]: не могу поймать исключение _com_error
От: OlegO Россия http://www.mediachase.ru
Дата: 21.03.02 09:30
Оценка: 1 (1)
Здравствуйте 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);
      }
С уважением, OlegO.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.