共用方式為


疑難排解秘訣

[與此頁面 相關的功能 DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayerIMFMediaEngine音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議盡可能重寫使用舊版 API 的現有程式碼,以使用新的 API。]

下列秘訣可協助您避免 DirectShow 應用程式中的死結或當機。

全域物件

全域 C++ 物件不應該在其建構函式方法中建立 DirectShow 物件,或將其釋放在其解構函式方法中。 這樣做可能會導致應用程式無限期地封鎖,原因如下:

執行緒無法在 DLL 的進入點函式內結束。 核心 32 會在進入點函式期間保留全域進程鎖定,而鎖定可防止執行緒結束。 由於某些 DirectShow 物件擁有線程,因此如果從 DLL 進入點函式內部釋出,它們就可以封鎖。 如果應用程式具有全域 C++ 物件,C 執行時間 DLL 會在卸載 DLL 時呼叫物件的解構函式。 如果解構函式釋放 DirectShow 物件,它可能會因故封鎖。

基於類似的原因,DLL 不應該在其進入點常式中建立或釋放 DirectShow 物件。

釋放介面

當您的應用程式仍在處理訊息之前,您應該釋放所有 DirectShow 介面指標,再結束訊息迴圈。 否則,您可能會看到各種判斷提示,因為某些 DirectShow 物件會在清除常式期間傳送訊息。

(為共同註冊,如果您使用 ATL CWindowImpl 類別,請等到 OnFinalMessage 釋放介面。相反地,當您處理 WM_CLOSE message.)

參考計數

當偵錯版本的 Quartz.dll卸載時,它會檢查任何 DirectShow 物件是否有未釋放的參考計數。 如果是,它會擲回判斷提示:

g_cFGObjects == 0 

當此判斷提示失敗時,這表示您的應用程式已洩漏參考計數。 檢閱您的程式碼,並確定您釋放所有介面指標。

在 DirectShow 中偵錯