static void create_proxy_test( IPSFactoryBuffer *ppsf, REFIID iid, const void *expected_vtbl ) { IRpcProxyBuffer *proxy = NULL; IUnknown *iface = NULL; HRESULT r; ULONG count; r = IPSFactoryBuffer_CreateProxy(ppsf, NULL, iid, &proxy, (void **)&iface); ok( r == S_OK, "IPSFactoryBuffer_CreateProxy failed %x\n", r ); ok( *(void **)iface == expected_vtbl, "wrong iface pointer %p/%p\n", *(void **)iface, expected_vtbl ); count = IUnknown_Release( iface ); ok( count == 1, "wrong refcount %u\n", count ); count = IRpcProxyBuffer_Release( proxy ); ok( count == 0, "wrong refcount %u\n", count ); dummy_unknown.ref = 4; r = IPSFactoryBuffer_CreateProxy(ppsf, (IUnknown *)&dummy_unknown, iid, &proxy, (void **)&iface); ok( r == S_OK, "IPSFactoryBuffer_CreateProxy failed %x\n", r ); ok( dummy_unknown.ref == 5, "wrong refcount %u\n", dummy_unknown.ref ); ok( *(void **)iface == expected_vtbl, "wrong iface pointer %p/%p\n", *(void **)iface, expected_vtbl ); count = IUnknown_Release( iface ); ok( count == 4, "wrong refcount %u\n", count ); ok( dummy_unknown.ref == 4, "wrong refcount %u\n", dummy_unknown.ref ); count = IRpcProxyBuffer_Release( proxy ); ok( count == 0, "wrong refcount %u\n", count ); ok( dummy_unknown.ref == 4, "wrong refcount %u\n", dummy_unknown.ref ); }
static ULONG WINAPI StdProxy_Release(LPRPCPROXYBUFFER iface) { ULONG refs; StdProxyImpl *This = impl_from_IRpcProxyBuffer(iface); TRACE("(%p)->Release()\n",This); refs = InterlockedDecrement(&This->RefCount); if (!refs) { if (This->pChannel) IRpcProxyBuffer_Disconnect(&This->IRpcProxyBuffer_iface); if (This->base_object) IUnknown_Release( This->base_object ); if (This->base_proxy) IRpcProxyBuffer_Release( This->base_proxy ); IPSFactoryBuffer_Release(This->pPSFactory); HeapFree(GetProcessHeap(),0,This); } return refs; }