我寫一個插件Remote Desktop Connection Broker,在ITsSbPlugin::Initialize
方法它規定我可以保留這個指針的副本嗎?
插件應該叫OnInitialized指定的ITsSbPluginNotifySink下沉對象。
我該怎麼做,但我注意到ITsSbPluginNotifySink
它也有一個OnTerminated()
方法。它不會在ITsSbPlugin::Terminate
中說您需要撥打OnTerminated()
,但是我應該嗎?
如果我確實需要撥打OnTerminated()
我應該將ITsSbPluginNotifySink
中的傳遞複製到本地變量並使用它來調用OnTerminated()
?
class CTsSbPluginProxy : public ITsSbPlugin
{
public:
//(Snip)
HRESULT STDMETHODCALLTYPE Initialize(
__RPC__in_opt ITsSbProvider *pProvider,
__RPC__in_opt ITsSbPluginNotifySink *pNotifySink,
__RPC__in_opt ITsSbPluginPropertySet *pPropertySet);
HRESULT STDMETHODCALLTYPE Terminate(HRESULT hr);
private:
//(Snip)
ITsSbPluginNotifySink *m_pNotifySink
};
HRESULT STDMETHODCALLTYPE CTsSbPluginProxy::Initialize(
__RPC__in_opt ITsSbProvider *pProvider,
__RPC__in_opt ITsSbPluginNotifySink *pNotifySink,
__RPC__in_opt ITsSbPluginPropertySet *pPropertySet)
{
//(Snip)
m_pNotifySink = pNotifySink;
m_pNotifySink->OnInitialized(S_OK);
return S_OK;
}
HRESULT STDMETHODCALLTYPE CTsSbPluginProxy::Terminate(HRESULT hr)
{
//(Snip)
//Is this legal?
m_pNotifySink->OnTerminated();
return S_OK;
}
我對這些特定的界面並不熟悉,但從對文檔的隨意瀏覽中,我會說你處於正確的軌道上。但是有一件事:如果你想保持它超出'Initialize'調用,你必須在指針上調用'AddRef';當你不再需要它的時候你必須調用'Release'(可能在'Terminate',在'OnTerminate'調用之後)。否則,該對象可能會過早被破壞,並且您將留下一個懸掛指針。 –
@IgorTandetnik我剛剛發現[這個msdn arcive](http://archive.msdn.microsoft.com/rdsdev),其中包含示例代碼,它們與我發佈的內容類似。發佈你說的答案,我會接受它。 –