实现 IAMErrorLog

[与此页面关联的功能 DirectShow 是旧版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音频/视频捕获所取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能在 Media Foundation 中使用 MediaPlayerIMFMediaEngine音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 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 Editing Services 定义。 有关错误列表,请参阅 呈现错误

pExtraInfo 参数包含指向 VARIANT 类型的指针,该类型包含有关错误的其他信息。 VARIANT 的数据类型和内容取决于发生的特定错误。 例如,如果错误是由错误的文件名引起的,则 VARIANT 是文件名错误的字符串。 某些错误没有额外信息,因此 pExtraInfo 可能为 NULL。 以下代码演示如何测试 VARIANT 的 vt 成员,该成员指示数据类型,并相应地设置消息的格式。

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

Label
pExtraInfo

. 此外,VARIANT 在方法返回后变为无效,因此以后不要引用它。

 

记录错误