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