共用方式為


偵錯輸出函式

[與此頁面相關聯的功能,DirectShow是舊版功能。 它已被 MediaPlayer、imfMediaEngine 取代,並在媒體基金會 音訊/視訊擷取。 這些功能已針對 Windows 10 和 Windows 11 進行優化。 Microsoft強烈建議新程式代碼盡可能在媒體 基礎中使用 MediaPlayerIMFMediaEngine 音訊/視訊擷取,而不是 DirectShow。 Microsoft建議使用舊版 API 的現有程式代碼,盡可能改寫成使用新的 API。]

DirectShow 基類 提供數個巨集來顯示偵錯資訊。

功能 描述
DbgCheckModuleLevel 檢查是否為指定的訊息類型和層級啟用記錄。
DbgDumpObjectRegister 顯示使用中對象的相關信息。
DbgInitialise 初始化偵錯連結庫。
DbgLog 如果針對指定的類型和層級啟用記錄,請將字串傳送至偵錯輸出位置。
DbgOutString 將字串傳送至偵錯輸出位置。
DbgSetModuleLevel 設定一或多個訊息類型的記錄層級。
DbgTerminate 清除偵錯連結庫。
DisplayType 將媒體類型的相關信息傳送至偵錯輸出位置。
DumpGraph 將篩選圖形的相關信息傳送至偵錯輸出位置。
GuidNames 包含代表 Uuids.h 中所定義 GUID 之字串的全域陣列。
NAME 產生僅限偵錯的字串。
附註 將字串傳送至偵錯輸出位置。
提醒 在編譯時期產生提醒。

 

登錄機碼

DirectShow 中的偵錯輸出函式會使用一組登錄機碼。 這些登錄機碼的位置取決於 Windows 版本。

Windows Vista之前,偵錯機碼位於下列路徑底下:

HKEY_LOCAL_MACHINE\SOFTWARE\偵錯

在 Windows Vista 或更新版本中,它們位於下列路徑之下:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DirectShow\Debug

對於第三方篩選,位置取決於使用哪個版本的 DirectShow 基類 來建置篩選。 Windows SDK for Windows Vista 中包含的版本會使用較新的路徑。 舊版使用較舊的路徑。

在後續的備註中,使用debugRoot><標籤來指出這兩個路徑。 根據 Windows 版本或基類的版本,取代正確的路徑。

偵錯記錄

DirectShow 會定義數種訊息類型,如下表所示。

價值 描述
LOG_ERROR 錯誤通知。
LOG_LOCKING 鎖定和解除鎖定重要區段。
LOG_MEMORY 記憶體配置,以及物件建立和解構。
LOG_TIMING 計時和效能測量。
LOG_TRACE 一般呼叫追蹤。
透過CUSTOM5 CUSTOM1 適用於自定義偵錯訊息

 

每個 DirectShow 偵錯記錄函式都會指定訊息類型和記錄層級。 只有當該訊息類型的目前偵錯層級等於或大於記錄函式中指定的層級時,才會顯示偵錯訊息。 否則會忽略訊息。

例如,如果LOG_TRACE層級為 3 或更高,下列程式代碼會輸出字串「這是偵錯訊息」:

DbgLog((LOG_TRACE, 3, TEXT("This is a debug message")));

每個模組都可以為每個訊息類型設定自己的偵錯層級。 (模組 是可以使用 LoadLibrary 函式載入的 DLL 或可執行文件。模組的偵錯層級會出現在登錄的下列機碼底下:

HKEY_LOCAL_MACHINE\<DebugRoot>\<ModuleName>\<MessageType>

其中 <訊息類型> 為訊息類型減去初始 「LOG_」 ;例如,LOG_LOCKING 訊息的 LOCKING。 載入模組時,偵錯連結庫會在登錄中尋找模組的記錄層級。 如果登錄機碼不存在,偵錯連結庫會建立它們。

模組也可以使用 DbgSetModuleLevel 函式,在運行時間設定自己的層級。 若要將訊息傳送至偵錯輸出,請呼叫 DbgLog 巨集。 下列範例會建立類型為 LOG_TRACE 的層級 3 訊息:

您也可以使用下列登入機碼來指定全域記錄層級:

\HKEY_LOCAL_MACHINE\<DebugRoot>\GLOBAL\<Message Type>

偵錯連結庫會使用哪個層級大於、全域層級或模組層級。

偵錯輸出位置

偵錯輸出位置是由另一個登錄機碼所決定:

HKEY_LOCAL_MACHINE\<DebugRoot>\<Modile Name>\LogToFile

如果此機碼的值 Console,輸出會移至主控台視窗。 如果值是 DebDebugDebugger或空字串,則輸出會移至調試程序視窗。 否則,輸出會寫入登錄機碼所指定的檔案。

可執行檔使用 DirectShow 偵錯連結庫之前,它必須呼叫 DbgInitialise 函式。 之後,它必須呼叫 DbgTerminate 函式。 DLL 不需要呼叫這些函式,因為 DLL 進入點(定義於基類連結庫中定義)會自動呼叫它們。

偵錯公用程式