int FreeCcw(Ccw *ccw)
        {
            lock (_lock)
            {
                // Shadow got resurrected by a call to QueryInterface from another thread
                if (ccw->RefCount != 0)
                {
                    return(ccw->RefCount);
                }

                var intPtr = new IntPtr(ccw);
                var type   = _backShadows[intPtr];
                _backShadows.Remove(intPtr);
                _shadows.Remove(type);
                Marshal.FreeHGlobal(intPtr);
                if (_shadows.Count == 0)
                {
                    _handle?.Free();
                    _handle = null;
                    try
                    {
                        Target.OnUnreferencedFromNative();
                    }
                    catch (Exception e)
                    {
                        MicroComRuntime.UnhandledException(Target, e);
                    }
                }
            }

            return(0);
        }
Beispiel #2
0
 internal int QueryInterface(Ccw *ccw, Guid *guid, void **ppv)
 {
     if (MicroComRuntime.TryGetTypeForGuid(*guid, out var type))
     {
         return(QueryInterface(type, ppv));
     }
     else
     {
         return(unchecked ((int)0x80004002u));
     }
 }
        internal int Release(Ccw *ccw)
        {
            Interlocked.Decrement(ref _refCount);
            var cnt = Interlocked.Decrement(ref ccw->RefCount);

            if (cnt == 0)
            {
                return(FreeCcw(ccw));
            }

            return(cnt);
        }
        internal int AddRef(Ccw *ccw)
        {
            if (Interlocked.Increment(ref _refCount) == 1)
            {
                try
                {
                    Target.OnReferencedFromNative();
                }
                catch (Exception e)
                {
                    MicroComRuntime.UnhandledException(Target, e);
                }
            }

            return(Interlocked.Increment(ref ccw->RefCount));
        }
 internal int QueryInterface(Ccw *ccw, Guid *guid, void **ppv)
 {
     if (MicroComRuntime.TryGetTypeForGuid(*guid, out var type))
     {
         return(QueryInterface(type, ppv));
     }
     else if (*guid == MicroComRuntime.ManagedObjectInterfaceGuid)
     {
         ccw->RefCount++;
         *ppv = ccw;
         return(0);
     }
     else
     {
         return(unchecked ((int)0x80004002u));
     }
 }
 static int Release(Ccw *ccw) => ccw->GetShadow().Release(ccw);
 static int AddRef(Ccw *ccw) => ccw->GetShadow().AddRef(ccw);
 static int QueryInterface(Ccw *ccw, Guid *guid, void **ppv) => ccw->GetShadow().QueryInterface(ccw, guid, ppv);