Implementación de IAMErrorLog

[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine y Captura de audio/vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer, IMFMediaEngine y Audio/Video Capture en Media Foundation en lugar de DirectShow, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.

[Esta API no se admite y puede modificarse o no estar disponible en el futuro].

La interfaz IAMErrorLog contiene un único método, LogError. Los parámetros del método contienen información sobre el error que se produjo.

STDMETHODIMP LogError(
    LONG Severity,          // Reserved. Do not use.
    BSTR ErrorString,       // Description.
    LONG ErrorCode,         // Error code.
    HRESULT hresult,        // HRESULT that caused the error.
    VARIANT *pExtraInfo);   // Extra information about the error.

DirectShow Editing Services define el código de error y la cadena de error. Para obtener una lista de errores, consulte Rendering Errors(Errores de representación).

El parámetro pExtraInfo contiene un puntero a un tipo VARIANT que contiene información adicional sobre el error. El tipo de datos y el contenido de VARIANT dependen del error específico que se produjo. Por ejemplo, si el error fue causado por un nombre de archivo incorrecto, VARIANT es una cadena con el nombre de archivo incorrecto. Algunos errores no tienen información adicional, por lo que pExtraInfo podría ser NULL. En el código siguiente se muestra cómo probar el miembro vt de VARIANT, que indica el tipo de datos y dar formato a un mensaje en consecuencia.

if( pExtraInfo )    // Report extra information, if any. 
{                           
    printf("\tExtra info: ");
    if( pExtraInfo->vt == VT_BSTR )      // Extra info is a BSTR.
    {
        UINT len = SysStringLen(pExtraInfo->bstrVal);
        char *szExtra = new char[len];
        if (szExtra != NULL)
        {
            // Note - If the BSTR contains embedded NULL characters, this
            // will only pick up the first sub-string.
            WideCharToMultiByte(CP_ACP, 0, pExtraInfo->bstrVal, -1, 
                szExtra, len, 0, 0);
            printf("%s\n", szExtra);
            delete [] szExtra;
        }
    } 
    else if( pExtraInfo->vt == VT_I4 )   // Extra info is an integer.
        printf("%d\n", pExtraInfo->lVal);

    else if( pExtraInfo->vt == VT_R8 )   // Extra info is floating-point.
        printf("%f\n", pExtraInfo->dblVal);
}

Nota:

No libere la VARIANTE a la que apunta

Etiqueta Value
pExtraInfo

. Además, variant se convierte en no válida después de que el método devuelva, por lo que no haga referencia a él más adelante.

 

Errores de registro