Действительно... происходящее можно объяснить тем что акспта где то внутри класса COM вместо кода
if ( FAILED( dispIface.Invoke( ... ) ) )
{
// raise error
}
использует
if ( dispIface.Invoke( ... ) != 0 )
{
// raise error
}
в ком-объектах почти все методы по идее должны возвращать значение типа HRESULT, нулевое значение которого (или константа S_OK) означает полный успех операции. Но значение это комплексное, разбито на битовые маски, из которых только часть означает фатальную ошибку.
Вот часть файла winerror.h, для прояснения ситуации:
PHP код:
//
// Generic test for success on any status value (non-negative numbers
// indicate success).
//
#define SUCCEEDED(Status) ((HRESULT)(Status) >= 0)
//
// and the inverse
//
#define FAILED(Status) ((HRESULT)(Status)<0)
//
// Generic test for error on any status value.
//
#define IS_ERROR(Status) ((unsigned long)(Status) >> 31 == SEVERITY_ERROR)