Поделиться через


Реализация IAMErrorLog

[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует, чтобы новый код использовал MediaPlayer, IMFMediaEngine и аудио- и видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, использующий устаревшие API, чтобы по возможности использовать новые API.]

[Этот API не поддерживается и может быть изменен или недоступен в будущем.]

Интерфейс IAMErrorLog содержит один метод LogError. Параметры метода содержат сведения об ошибке, которая произошла.

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. Список ошибок см. в разделе Ошибки отрисовки.

Параметр pExtraInfo содержит указатель на тип VARIANT, содержащий дополнительные сведения об ошибке. Тип данных и содержимое VARIANT зависят от конкретной ошибки. Например, если ошибка была вызвана неправильным именем файла, variant является строкой с неправильным именем файла. Некоторые ошибки не содержат дополнительных сведений, поэтому pExtraInfo может иметь значение NULL. В следующем коде показано, как протестировать член vt variant, который указывает тип данных, и соответствующим образом отформатировать сообщение.

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

Примечание

Не освобождайте variant, на который указывает

Метка Значение
pExtraInfo

. Кроме того, variant становится недопустимым после возврата метода, поэтому не ссылайтесь на него позже.

 

Ошибки ведения журнала