2013-11-21 116 views
1

我寫一個插件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; 
} 
+4

我對這些特定的界面並不熟悉,但從對文檔的隨意瀏覽中,我會說你處於正確的軌道上。但是有一件事:如果你想保持它超出'Initialize'調用,你必須在指針上調用'AddRef';當你不再需要它的時候你必須調用'Release'(可能在'Terminate',在'OnTerminate'調用之後)。否則,該對象可能會過早被破壞,並且您將留下一個懸掛指針。 –

+0

@IgorTandetnik我剛剛發現[這個msdn arcive](http://archive.msdn.microsoft.com/rdsdev),其中包含示例代碼,它們與我發佈的內容類似。發佈你說的答案,我會接受它。 –

回答

0

可能缺少MSDN主文檔,但我發現this msdn code archive。它包含一個示例項目,他們在那裏保留ITsSbPluginNotifySink的副本,所以我相信我的第一個假設是正確的,我應該保留指針的副本並在最後發佈它(也要感謝Igor Tandetnik for reminding me about calling AddRef

+0

您可以使用智能指針消除對AddRef/Release的需求。 Microsoft提供了一些可供選擇的內容,請參閱http://stackoverflow.com/questions/5634996/which-com-smart-pointer-classes-to-use –

相關問題