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(); } |
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(); } }; |
RegisterService
:C++ |
---|
pRSP->RegisterService(SID_MyService, NULL); |
Filter Graph Manager 會保留服務物件的參考計數,直到服務取消註冊為止。 若要防止迴圈參考計數,服務物件不應該在篩選圖形管理員上保存參考計數。 例如,您無法使用服務物件的解構函式方法來取消註冊服務,因為只要服務在 Filter Graph Manager 上保存參考計數,則永遠不會呼叫解構函式。 其中一個解決方案是建立個別的物件,以註冊和取消註冊服務。 或者,您只要在註冊服務物件之後釋出服務物件,並讓 Filter Graph Manager 控制其存留期。
規格需求
最低支援的用戶端 | Windows XP [僅限傳統型應用程式] |
最低支援的伺服器 | Windows Server 2003 [僅限傳統型應用程式] |
目標平臺 | Windows |
標頭 | strmif.h (包含 Dshow.h) |
程式庫 | Strmiids.lib |