C++ 我可以保留这个指针的副本吗?
我正在为它编写一个插件,使用它声明的方法 插件应在指定的ITSbPlugInNotifySink接收器对象上调用OnInitialized 我知道,但是我注意到在ITSbPlugInnotifySink上它也有一个方法。它并没有说你需要打电话到终端,但我应该吗 如果我真的需要调用OnTerminated,我应该将传入的sbpluginnotifysink复制到一个局部变量中,并使用它来调用OnTerminated吗C++ 我可以保留这个指针的副本吗?,c++,winapi,com,windows-server-2012,C++,Winapi,Com,Windows Server 2012,我正在为它编写一个插件,使用它声明的方法 插件应在指定的ITSbPlugInNotifySink接收器对象上调用OnInitialized 我知道,但是我注意到在ITSbPlugInnotifySink上它也有一个方法。它并没有说你需要打电话到终端,但我应该吗 如果我真的需要调用OnTerminated,我应该将传入的sbpluginnotifysink复制到一个局部变量中,并使用它来调用OnTerminated吗 MSDN主文档可能缺少,但我发现。它包含一个示例项目,其中他们保留了一份ITSb
MSDN主文档可能缺少,但我发现。它包含一个示例项目,其中他们保留了一份ITSbPlugInnotifySink的副本,因此我认为我的第一个假设是正确的,即我应该保留一份指针副本,并在最后发布它。还感谢Igor Tandetnik我不熟悉这些特定的接口,但从文档的随意浏览来看,我认为你走的是对的。但是有一件事:如果要使指针保持在初始化调用之外,必须对指针调用AddRef;然后,当您不再需要它时,您必须调用Release,可能是在Terminate中,在OnTerminate调用之后。否则,该对象可能会过早地被销毁,留下一个悬空的指针。@IgorTandetnik我刚刚发现其中包含示例代码,它们的操作与我发布的类似。把你所说的作为答案贴出来,我会接受的。你可以通过使用智能指针来消除AddRef/Release的需要。Microsoft提供了一些可供选择的选项,请参阅
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;
}