Помогите с проблемой обработок ошибок в COM
От: AlexKn  
Дата: 23.11.01 08:26
Оценка:
Вроде ничего криминального в строках этих нет
Я делаю интерфейс ITest, делаю поддержку ISupportErrorInfo, создаю метод Init()
и пишу в нем такой код
STDMETHODIMP CTest::Init()
{
// TODO: Add your implementation code here
Error("Error out");
return E_FAIL;
}
Данный метод вызывает exception, когда я пытаюсь его вызвать из клиента
CoInitialize(NULL);
ITestPtr m_ITest;

if(FAILED(m_ITest.CreateInstance(__uuidof(TestObj))))
return -1;
if(FAILED(m_ITest->Init()))
return -1;

Отладчик показывает, что exception вызывает строка
if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this));
в методе который создает компилятор.
inline HRESULT ITest::Init ( ) {
HRESULT _hr = raw_Init();
if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this));
return _hr;
}

Кто-нибудь сталкивался с такой проблемой? Подскажите плиз, свои мысли потихоньку заканчиваются
Re: Помогите с проблемой обработок ошибок в COM
От: OlegO Россия http://www.mediachase.ru
Дата: 23.11.01 08:49
Оценка:
Здравствуйте AlexKn, Вы писали:

AK>STDMETHODIMP CTest::Init()

AK>{
AK> // TODO: Add your implementation code here
AK> Error("Error out");
AK> return E_FAIL;
AK>}
AK>Данный метод вызывает exception, когда я пытаюсь его вызвать из клиента
AK> CoInitialize(NULL);
AK> ITestPtr m_ITest;

AK> if(FAILED(m_ITest.CreateInstance(__uuidof(TestObj))))

AK> return -1;
AK> if(FAILED(m_ITest->Init()))
AK> return -1;

AK>Отладчик показывает, что exception вызывает строка


А что тебя смущает? по-моему все нормально, ты из метода возвращаешь E_FAIL
и используешь Ptr указатели, а они при получении ошибки генерят исключение.

Перехватывай исключение try, catch и впред:
...
try
{
     m_ITest->Init();
}
catch(_com_error &e)
{
   // если мы попали сюда, то была ошибка у "e" можешь запросить дополнителную информацию
}
...
С уважением, OlegO.
Re[2]: Помогите с проблемой обработок ошибок в COM
От: AlexKn  
Дата: 23.11.01 09:03
Оценка:
Здравствуйте OlegO, Вы писали:

OO>Здравствуйте AlexKn, Вы писали:


AK>>STDMETHODIMP CTest::Init()

AK>>{
AK>> // TODO: Add your implementation code here
AK>> Error("Error out");
AK>> return E_FAIL;
AK>>}
AK>>Данный метод вызывает exception, когда я пытаюсь его вызвать из клиента
AK>> CoInitialize(NULL);
AK>> ITestPtr m_ITest;

AK>> if(FAILED(m_ITest.CreateInstance(__uuidof(TestObj))))

AK>> return -1;
AK>> if(FAILED(m_ITest->Init()))
AK>> return -1;

AK>>Отладчик показывает, что exception вызывает строка


OO>А что тебя смущает? по-моему все нормально, ты из метода возвращаешь E_FAIL

OO>и используешь Ptr указатели, а они при получении ошибки генерят исключение.

OO>Перехватывай исключение try, catch и впред:

OO>
OO>...
OO>try
OO>{
OO>     m_ITest->Init();
OO>}
OO>catch(_com_error &e)
OO>{
OO>   // если мы попали сюда, то была ошибка у "e" можешь запросить дополнителную информацию
OO>}
OO>...
OO>


Понимаешь, можно конечно делать с try и catch. Но для чего тогда используют HRESULT. Генерят то исключение не пойнтеры, а _com_issue_errorex(_hr, this, __uuidof(this)); Этого не должно быть и пропадает весь механизм получения ошибки через GetErrorInfo и GetDescription. По моему это не нормально, все примеры которые я видел работают именно на проверку
if(FAILED(...))
Re[3]: Помогите с проблемой обработок ошибок в COM
От: Андрей Россия  
Дата: 23.11.01 09:09
Оценка:
Здравствуйте AlexKn, Вы писали:

AK>Понимаешь, можно конечно делать с try и catch. Но для чего тогда используют HRESULT. Генерят то исключение не пойнтеры, а _com_issue_errorex(_hr, this, __uuidof(this)); Этого не должно быть и пропадает весь механизм получения ошибки через GetErrorInfo и GetDescription. По моему это не нормально, все примеры которые я видел работают именно на проверку

AK>if(FAILED(...))

Так ты тогда не используй SmartInterfaces, а работай через CoCreateInstance / QueryInterface и так далее на низком уровне и проверяй if (FAILED(...)).

Хотя и при использовании _com_error ничего не теряется, смотри его описание в MSDN (_com_error::ErrorInfo).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.