我可以保留这个指针的副本吗?
我写一个插件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;
}
可能缺少MSDN主文档,但我发现this msdn code archive。它包含一个示例项目,他们在那里保留ITsSbPluginNotifySink
的副本,所以我相信我的第一个假设是正确的,我应该保留指针的副本并在最后发布它(也要感谢Igor Tandetnik for reminding me about calling AddRef
)
您可以使用智能指针消除对AddRef/Release的需求。 Microsoft提供了一些可供选择的内容,请参阅http://*.com/questions/5634996/which-com-smart-pointer-classes-to-use –
我对这些特定的界面并不熟悉,但从对文档的随意浏览中,我会说你处于正确的轨道上。但是有一件事:如果你想保持它超出'Initialize'调用,你必须在指针上调用'AddRef';当你不再需要它的时候你必须调用'Release'(可能在'Terminate',在'OnTerminate'调用之后)。否则,该对象可能会过早被破坏,并且您将留下一个悬挂指针。 –
@IgorTandetnik我刚刚发现[这个msdn arcive](http://archive.msdn.microsoft.com/rdsdev),其中包含示例代码,它们与我发布的内容类似。发布你说的答案,我会接受它。 –