Re[2]: Как по-человечески вернуть описание ошибки из COM на
От: fbr  
Дата: 29.07.03 09:18
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

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


fbr>>Пардон за тупой квесчн, просто скока не пробовал и читал МСДН — ничего не получается.

fbr>>Надо вернуть из COMа свой error description(процедура возвращает не S_OK или S_FALSE) например то что возвращает GetLastError. Как можно это сделать (пробовал определить свой код ошибки и поюзать ATLные ф-ции Error — нифига не выходит, интерфейс подерживает ISupportErrorInfo)?

OE>в COM-объекте перед выходом из метода:


OE>
OE>        Error( "описание ошибки" );
OE>        return E_FAIL;
OE>


OE>в программе, которая использует COM-объект:

OE>если обертка для COM-объекта создавалась через
OE>
OE>#import "mycom.dll"  no_namespace named_guids
OE>

OE>то просто:
OE>
OE>try
OE>{
OE>// вызов метода COM-объекта
OE>}
OE>catch ( _com_error & er )
OE>{
OE>  // в  er.Description() лежит "описание ошибки"
OE>}
OE>


OE>если через

OE>
OE>#import "mycom.dll"  raw_interfaces_only, no_namespace, named_guids
OE>

OE>то информацию об ошибке нужно предварительно вытащить
OE>
OE>HRESULT hres;
OE>IErrorInfo* pErr = NULL;

OE>try
OE>{
OE>    hres = ....// вызов метода COM-объекта

OE>    if ( FAILED( hres ) )
OE>    {
OE>        GetErrorInfo( NULL, &pErr );
OE>        _com_raise_error( hres, pErr );
OE>    }
OE>}
OE>catch ( _com_error & er )
OE>{
OE>  // в  er.Description() лежит "описание ошибки"
OE>}
OE>


Это все хорошо конечно но следующий кусок кода возвращает "Unspecified error" вместо "Error Raised"
STDMETHODIMP CTestObj::doError(VARIANT vIn)
{
    if (vIn.vt != VT_BSTR)
    {
        Error("Error Raised");
        return E_FAIL;
    }

    return S_OK;
}

VBScript
Set obj = CreateObject("TestCOM.TestObj")

obj.doError(0)

Set obj = Nothing
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.