Здравствуйте, 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