共用方式為


實作 IAMErrorLog

[與此頁面 相關的功能 DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 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 編輯服務所定義。 如需錯誤清單,請參閱 轉譯錯誤

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

標籤
pExtraInfo

. 此外,VARIANT 會在方法傳回之後變成無效,因此請稍後不要參考它。

 

記錄錯誤