еще раз про InterfaceSupportsErrorInfo
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 25.10.02 10:29
Оценка:
есть сервер с поддержкой ISupportErrorInfo, в нем метод

STDMETHODIMP CMyComp::Method()
{
    Error("Описание ошибки");
    return E_FAIL;
}


подключаю, вызываю:

#import "MyComp.dll" no_namespace, named_guids

try
{
    IMyCompPtr->Method();
}
catch ( _com_error & er )
{
   // рассматриваем er видим описание ошибки
}



теперь надо подключить так :

#import "MyComp.dll" raw_interfaces_only, raw_native_types, no_namespace, named_guids


обертка уже не гененит исключение, пытаюсь сделать это сам:

try
{
    _com_issue_errorex( IMyCompPtr->Method(), IMyCompPtr, __uuidof(IMyCompPtr) );
}
catch ( _com_error & er )
{
   if ( FAILED (er.Error() ) )
   {
       // исключение прилетело,
       // рассматриваем er и не видим описание ошибки :(
   }
}


что не так, как все-таки вытянуть установленное в сервере описание ошибки?
Re: еще раз про InterfaceSupportsErrorInfo
От: Алекс Россия http://wise-orm.com
Дата: 25.10.02 10:44
Оценка: 24 (1)
Здравствуйте Odi$$ey, Вы писали:

O$>есть сервер с поддержкой ISupportErrorInfo, в нем метод

[]

O$>обертка уже не гененит исключение, пытаюсь сделать это сам:

O$>
O$>try
O$>{
O$>    _com_issue_errorex( IMyCompPtr->Method(), IMyCompPtr, __uuidof(IMyCompPtr) );
O$>}
O$>catch ( _com_error & er )
O$>{
O$>   if ( FAILED (er.Error() ) )
O$>   {
O$>       // исключение прилетело,
O$>       // рассматриваем er и не видим описание ошибки :(
O$>   }
O$>}
O$>


O$>что не так, как все-таки вытянуть установленное в сервере описание ошибки?

Можно так
hr = //бяка
IErrorInfo* pErr;
GetErrorInfo(NULL,&pErr);
_com_raise_error(hr,pErr);


В принципе, лучше сначало спросить про ISupportErrorInfo, но так как сервер твой и ты точно знаешь, что он IErrorInfo запостил (SetErrorInfo), то все пучком.
Re: еще раз про InterfaceSupportsErrorInfo
От: retalik www.airbandits.com/
Дата: 25.10.02 10:46
Оценка: 24 (1)
Здравствуйте Odi$$ey, Вы писали:

O$>теперь надо подключить так :

O$>
O$>#import "MyComp.dll" raw_interfaces_only, raw_native_types, no_namespace, named_guids
O$>


O$>обертка уже не гененит исключение, пытаюсь сделать это сам:

O$>
O$>try
O$>{
O$>    _com_issue_errorex( IMyCompPtr->Method(), IMyCompPtr, __uuidof(IMyCompPtr) );
O$>}
O$>catch ( _com_error & er )
O$>{
O$>   if ( FAILED (er.Error() ) )
O$>   {
O$>       // исключение прилетело,
O$>       // рассматриваем er и не видим описание ошибки :(
O$>   }
O$>}
O$>


O$>что не так, как все-таки вытянуть установленное в сервере описание ошибки?
Скорее всего, глотается где-то (GetErrorInfo можно вызвать только один раз). Ты попробуй просто сам получить контекст. Что-то вроде:
CComPtr<IErrorInfo> m_EI;
::GetErrorInfo(0, (void**)&m_EI); //HRESULT проверить бы надо

Если после этого ломает через m_EI работать, можно сконструировать _com_error:
_com_error err(0, m_EI);
Успехов,
Виталий.
Re[2]: еще раз про InterfaceSupportsErrorInfo
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 25.10.02 11:19
Оценка:
Здравствуйте retalik, Вы писали:

R>Скорее всего, глотается где-то (GetErrorInfo можно вызвать только один раз). Ты попробуй просто сам получить контекст. Что-то вроде:

R>
R>CComPtr<IErrorInfo> m_EI;
R>::GetErrorInfo(0, (void**)&m_EI); //HRESULT проверить бы надо 
R>


действительно, GetErrorInfo помог
только вот (void**) вроде как ни к чему, GetErrorInfo принимает IErrorInfo** и еще странность, если

CComPtr<IErrorInfo> m_EI;


то эксцепшены какие-то левые лезут, а если просто

IErrorInfo* m_EI;


и никаких Release, то все проходит тихо и гладко
Re[3]: еще раз про InterfaceSupportsErrorInfo
От: retalik www.airbandits.com/
Дата: 25.10.02 11:34
Оценка:
Здравствуйте Odi$$ey, Вы писали:

O$>действительно, GetErrorInfo помог
O$>только вот (void**) вроде как ни к чему, GetErrorInfo принимает IErrorInfo** и еще странность, если
O$>
O$>CComPtr<IErrorInfo> m_EI;
O$>

O$>то эксцепшены какие-то левые лезут, а если просто
O$>
O$>IErrorInfo* m_EI;
O$>

O$>и никаких Release, то все проходит тихо и гладко
Я догадываюсь, что ты все-таки _com_error используешь. В его конструкторе последний параметр означает "сделать ли AddRef интерфейсу IErrorInfo". По умолчанию стоит "не сделать". А в деструкторе он его благополучно грохает. Так что или смарт-пойнтер, или bAddRef=false.
Успехов,
Виталий.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.