http://d.puremagic.com/issues/show_bug.cgi?id=4092



--- Comment #5 from Rainer Schuetze <r.sagita...@gmx.de> 2011-02-15 23:18:19 
PST ---
Overloading new seems to do the job without the patch in the runtime, so here
is my current implementation of COM objects:

extern (C) void*  gc_malloc( size_t sz, uint ba = 0 ); 

class ComObject : IUnknown
{
    new(uint size)
    {
        void* p = gc_malloc(size, 1); // BlkAttr.FINALIZE
        return p;
    }

    override HRESULT QueryInterface(in IID* riid, void** ppv) { ... }

    override ULONG AddRef()
    {
        LONG lRef = InterlockedIncrement(&count);
        if(lRef == 1)
            GC.addRoot(cast(void*) this);
        return lRef;
    }

    override ULONG Release()
    {
        LONG lRef = InterlockedDecrement(&count);
        if (lRef == 0)
            GC.removeRoot(cast(void*) this);
        return cast(ULONG)lRef;
    }

    LONG count = 0;        // object reference count
}

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------

Reply via email to