Referenzzählen von Aktivierungskontexten

Aktivierungskontexte sind Objekte mit Verweiszählung. Ihre Anwendung muss über einen Verweis auf einen Aktivierungskontext verfügen, um sie verwenden zu können. Die Funktionen der Aktivierungskontext-API, die einen Aktivierungskontext annehmen, können ihre eigene Verweiszählung durchführen. Beispielsweise erhöht ActivateActCtx und DeactivateActCtx den Verweiszähler. Wenn Ihre Anwendung jedoch einen Aktivierungskontext übergibt, ohne diese Funktionen zu verwenden, sollte die Anwendung eine eigene Methode für die Verweiszählung bereitstellen.

Wenn eine Anwendung CreateActCtx aufruft,hat das zurückgegebene Handle einen Verweiszähler von 1. Nachdem die Anwendung mit dem Aktivierungskontext abgeschlossen wurde, sollte das Handle freigegeben und der Verweiszähler verringert werden, indem ReleaseActCtxaufgerufen wird. Versuchen Sie nicht, LocalFree, HeapFreeoder andere Speicherverwaltungsfunktionen für das Aktivierungskontexthandle zu verwenden.

Das folgende Beispiel zeigt eine Methode zum Verarbeiten der Verweiszählung über die Lebensdauer eines Aktivierungskontexts. Die Funktion Funkt erstellt einen Aktivierungskontext, den sie dann an das Objekt Target übergibt, wodurch der Verweiszähler auf 2 erhöht wird. Funkt gibt dann seinen Verweis auf den Aktivierungskontext frei und verringert den Verweiszähler wieder auf 1. Das Ziel besitzt dann die Freigabe seines eigenen Verweises, wenn SetActCtx erneut aufgerufen wird oder wenn das Objekt zerstört wird.

#include <windows.h>

class CMyObject 
{
private:
    HANDLE m_hActCtx;
public:
    CMyObject() : m_hActCtx(INVALID_HANDLE_VALUE) { }
    ~CMyObject() 
    { 
        if (m_hActCtx != INVALID_HANDLE_VALUE) 
        {
            ReleaseActCtx(m_hActCtx);
            m_hActCtx = INVALID_HANDLE_VALUE;
        }
    }
    void SetActCtx(HANDLE hActCtx) 
    {
        if (m_hActCtx != INVALID_HANDLE_VALUE) 
        {
            ReleaseActCtx(m_hActCtx);
        }
        m_hActCtx = hActCtx;
        if (m_hActCtx != INVALID_HANDLE_VALUE) 
        {
            AddRefActCtx(m_hActCtx);
        }
    }
    void DoWorkWithActCtx();
};

void Funct(CMyObject &Target) 
{
    HANDLE hActCtx;
    ACTCTX actctx = { sizeof(ACTCTX) };
    hActCtx = CreateActCtx(&actctx);  //create activation context  
    Target.SetActCtx(hActCtx);    //pass activation context to Target; 
    // actctx now has 1 more reference
    ReleaseActCtx(hActCtx);
}