Implementando IAMErrorLog

[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation em vez de DirectShow, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]

[Não há suporte para essa API e pode ser alterada ou indisponível no futuro.]

A interface IAMErrorLog contém um único método, LogError. Os parâmetros para o método contêm informações sobre o erro ocorrido.

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.

O código de erro e a cadeia de caracteres de erro são definidos pelos Serviços de Edição do DirectShow. Para obter uma lista de erros, consulte Erros de renderização.

O parâmetro pExtraInfo contém um ponteiro para um tipo VARIANT que contém informações adicionais sobre o erro. O tipo de dados e o conteúdo da VARIANT dependem do erro específico ocorrido. Por exemplo, se o erro foi causado por um nome de arquivo incorreto, VARIANT é uma cadeia de caracteres com o nome de arquivo incorreto. Alguns erros não têm informações extras, portanto, pExtraInfo pode ser NULL. O código a seguir mostra como testar o membro vt da VARIANT, que indica o tipo de dados e formatar uma mensagem adequadamente.

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);
}

Observação

Não libere a VARIANT apontada por

Rótulo Valor
pExtraInfo

. Além disso, variant torna-se inválido depois que o método retorna, portanto, não faça referência a ele mais tarde.

 

Erros de registro em log