疑難排解秘訣
[與此頁面 相關的功能 DirectShow是舊版功能。 它已被 MediaPlayer、 IMFMediaEngine和 Media Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayer、 IMFMediaEngine 和 音訊/視訊擷取 ,而不是 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
當此判斷提示失敗時,這表示您的應用程式已洩漏參考計數。 檢閱您的程式碼,並確定您釋放所有介面指標。
相關主題