我可以保留这个指针的副本吗?

问题描述:

我写一个插件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),其中包含示例代码,它们与我发布的内容类似。发布你说的答案,我会接受它。 –

可能缺少MSDN主文档,但我发现this msdn code archive。它包含一个示例项目,他们在那里保留ITsSbPluginNotifySink的副本,所以我相信我的第一个假设是正确的,我应该保留指针的副本并在最后发布它(也要感谢Igor Tandetnik for reminding me about calling AddRef

+0

您可以使用智能指针消除对AddRef/Release的需求。 Microsoft提供了一些可供选择的内容,请参阅http://*.com/questions/5634996/which-com-smart-pointer-classes-to-use –