Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我可以保留这个指针的副本吗?_C++_Winapi_Com_Windows Server 2012 - Fatal编程技术网

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

C++ 我可以保留这个指针的副本吗?,c++,winapi,com,windows-server-2012,C++,Winapi,Com,Windows Server 2012,我正在为它编写一个插件,使用它声明的方法 插件应在指定的ITSbPlugInNotifySink接收器对象上调用OnInitialized 我知道,但是我注意到在ITSbPlugInnotifySink上它也有一个方法。它并没有说你需要打电话到终端,但我应该吗 如果我真的需要调用OnTerminated,我应该将传入的sbpluginnotifysink复制到一个局部变量中,并使用它来调用OnTerminated吗 MSDN主文档可能缺少,但我发现。它包含一个示例项目,其中他们保留了一份ITSb

我正在为它编写一个插件,使用它声明的方法

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

我知道,但是我注意到在ITSbPlugInnotifySink上它也有一个方法。它并没有说你需要打电话到终端,但我应该吗

如果我真的需要调用OnTerminated,我应该将传入的sbpluginnotifysink复制到一个局部变量中,并使用它来调用OnTerminated吗


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;
}