IRegisterServiceProvider::RegisterService 方法 (strmif.h)

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

方法 RegisterService 會將物件註冊為服務。

語法

HRESULT RegisterService(
  [in] REFGUID  guidService,
  [in] IUnknown *pUnkObject
);

參數

[in] guidService

服務標識子 (SID) 服務。

[in] pUnkObject

服務物件的 IUnknown 介面指標,或 NULL 來取消註冊服務。

傳回值

傳回 HRESULT 值。

備註

服務是用戶端透過 COM IServiceProvider::QueryService 方法探索的介面,而不是透過一般的 IUnknown::QueryInterface 方法。 這兩種方法之間的差異在於 QueryInterface 會傳回原始物件上的介面,而 QueryService 可能會傳回另一個物件的介面。 (更精確地說, QueryInterface 保證您可以查詢原始介面和 IUnknown 傳回的介面,而您會收到相同的指標。 QueryService 沒有此保證。)

方法 RegisterService 可讓您向 Filter Graph 管理員註冊服務。 其他物件接著可以使用 IServiceProvider 介面來擷取物件。 這可促進不同 COM 對象之間的通訊,使用 Filter Graph Manager 作為中央通訊點。

服務是由 GUID 識別,稱為服務標識碼 (SID) 。 一個服務可以支援多個介面。 若要註冊服務,請呼叫 RegisterService,如下列程式代碼所示:

C++
DEFINE_GUID(SID_MyService, ....);
IRegisterServiceProvider *pRSP;
hr = pGraph->QueryInterface(IID_IRegisterServiceProvider, (void**)&pRSP);
if (SUCCEEDED(hr))
{
    IUnknown pServiceObj;
    MyCreateServiceHelper(SID_MyService, &pServiceObj);
    pRSP->RegisterService(SID_MyService, pServiceObj);
    pRSP->Release();
    pServiceObj->Release();
}
此範例假設 MyCreateServiceHelper 是可建立服務對象的協助程式函式。 用戶端可以藉由呼叫 IServiceProvider::QueryService 來取得服務對象的指標:
C++
IServiceProvider *pSP;
hr = pGraph->QueryInterface(IID_IServiceProvider, (void**)&pSP);
if (SUCCEEDED(hr))
{
    ISomeInterface *pService;
    hr = pSP->QueryService(SID_MyService, IID_ISomeInterface, (void**)&pService);
    pSP->Release();
    if (SUCCEEDED(hr))
    {
        pService->SomeMethod();
        pService->Release();
    }
};
若要取消註冊服務,請使用第二個參數中的NULL指標呼叫RegisterService
C++
pRSP->RegisterService(SID_MyService, NULL);
當 Filter Graph 管理員發行時,它會取消註冊所有服務。

Filter Graph Manager 會保留服務對象的參考計數,直到服務取消註冊為止。 若要防止迴圈參考計數,服務對象不應該在篩選圖形管理員上保存參考計數。 例如,您無法使用服務物件的解構函式方法來取消註冊服務,因為只要服務在 Filter Graph Manager 上保存參考計數,則永遠不會呼叫解構函式。 其中一個解決方案是建立個別的物件,以註冊和取消註冊服務。 或者,您只要在註冊服務對象之後釋出服務物件,並讓 Filter Graph Manager 控制其存留期。

規格需求

需求
最低支援的用戶端 Windows XP [僅限傳統型應用程式]
最低支援的伺服器 Windows Server 2003 [僅限傳統型應用程式]
目標平台 Windows
標頭 strmif.h (包含 Dshow.h)
程式庫 Strmiids.lib

另請參閱

錯誤和成功碼

IRegisterServiceProvider 介面