Condividi tramite


Implementazione di IAMErrorLog

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation invece di DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

[Questa API non è supportata e potrebbe essere modificata o non disponibile in futuro.]

L'interfaccia IAMErrorLog contiene un singolo metodo , LogError. I parametri del metodo contengono informazioni sull'errore che si è verificato.

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.

Il codice di errore e la stringa di errore sono definiti da DirectShow Editing Services. Per un elenco degli errori, vedere Errori di rendering.

Il parametro pExtraInfo contiene un puntatore a un tipo VARIANT che contiene informazioni aggiuntive sull'errore. Il tipo di dati e il contenuto di VARIANT dipendono dall'errore specifico che si è verificato. Ad esempio, se l'errore è stato causato da un nome file non corretto, VARIANT è una stringa con il nome file non valido. Alcuni errori non contengono informazioni aggiuntive, quindi pExtraInfo potrebbe essere NULL. Il codice seguente illustra come testare il membro vt di VARIANT, che indica il tipo di dati e formattare un messaggio di conseguenza.

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

Non liberare la VARIANTE a cui punta

Etichetta Valore
pExtraInfo

. Inoltre, variant diventa non valido dopo la restituzione del metodo, quindi non farvi riferimento in un secondo momento.

 

Registrazione degli errori