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

时间:2013-11-21 16:21:38

标签: c++ winapi com windows-server-2012

我在Remote Desktop Connection Broker方法中为ITsSbPlugin::Initialize编写了一个插件

  

插件应在指定的ITsSbPluginNotifySink接收器对象上调用OnInitialized。

我做了,但我注意到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;
}

1 个答案:

答案 0 :(得分:0)

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