IRegisterServiceProvider::RegisterService 方法 (strmif.h)

方法 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 介面