Могу ли я сохранить копию этого указателя?

Я пишу подключаемый модуль для брокера подключения к удаленному рабочему столу в разделе 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;
}

person Scott Chamberlain    schedule 21.11.2013    source источник
comment
Я не знаком с этими конкретными интерфейсами, но, бегло взглянув на документацию, могу сказать, что вы на правильном пути. Однако есть одно но: вы должны вызывать AddRef для указателя, если хотите сохранить его за пределами вызова Initialize; и вы должны затем вызвать Release на нем, когда он вам больше не нужен (вероятно, в Terminate, сразу после OnTerminate вызова). В противном случае объект может быть уничтожен преждевременно, и вы останетесь с оборванным указателем.   -  person Igor Tandetnik    schedule 21.11.2013
comment
@IgorTandetnik Я только что обнаружил этот архив msdn, который включает пример кода, и они делают то же, что и Я тоже отправил. Опубликуйте то, что вы сказали в качестве ответа, и я приму это.   -  person Scott Chamberlain    schedule 22.11.2013


Ответы (1)


В основной документации MSDN может отсутствовать, но я нашел этот код msdn архив. Он содержит пример проекта, в котором они хранят копию ITsSbPluginNotifySink, поэтому я считаю, что был прав в своем первом предположении, что я должен сохранить копию указателя и освободить его в конце (также спасибо Игорю Тандетнику за напоминание о звонке AddRef)

person Scott Chamberlain    schedule 22.11.2013
comment
Вы можете устранить необходимость в AddRef/Release, используя интеллектуальный указатель. Microsoft предоставляет некоторые из них на выбор, см. stackoverflow.com/questions/5634996/ - person Mark Ransom; 22.11.2013