static void test_refcount(void) { HRESULT hr; ULONG ref; LPDIRECTXFILE lpDirectXFile = NULL; LPDIRECTXFILEENUMOBJECT lpdxfeo; LPDIRECTXFILEDATA lpdxfd; DXFILELOADMEMORY dxflm; if (!pDirectXFileCreate) { win_skip("DirectXFileCreate is not available\n"); return; } hr = pDirectXFileCreate(&lpDirectXFile); ok(hr == DXFILE_OK, "DirectXFileCreate: %x\n", hr); if (!lpDirectXFile) { skip("Couldn't create DirectXFile interface\n"); return; } ref = getRefcount( (IUnknown *) lpDirectXFile); ok(ref == 1, "Got refcount %d, expected 1\n", ref); ref = IDirectXFile_AddRef(lpDirectXFile); ok(ref == 2, "Got refcount %d, expected 2\n", ref); ref = IDirectXFile_Release(lpDirectXFile); ok(ref == 1, "Got refcount %d, expected 1\n", ref); hr = IDirectXFile_RegisterTemplates(lpDirectXFile, template, sizeof(template) - 1);
static ULONG WINAPI ID3DXFileImpl_Release(ID3DXFile *iface) { ID3DXFileImpl *This = impl_from_ID3DXFile(iface); ULONG ref = InterlockedDecrement(&This->ref); TRACE("(%p)->(): new ref = %u\n", iface, ref); if (!ref) { IDirectXFile_Release(This->dxfile); HeapFree(GetProcessHeap(), 0, This); } return ref; }
ref = getRefcount( (IUnknown *) lpDirectXFile); ok(ref == 1, "Got refcount %d, expected 1\n", ref); ref = getRefcount( (IUnknown *) lpdxfeo); ok(ref == 1, "Got refcount %d, expected 1\n", ref); hr = IDirectXFileEnumObject_GetNextDataObject(lpdxfeo, &lpdxfd); ok(hr == DXFILE_OK, "IDirectXFileEnumObject_GetNextDataObject: %x\n", hr); ref = getRefcount( (IUnknown *) lpDirectXFile); ok(ref == 1, "Got refcount %d, expected 1\n", ref); ref = getRefcount( (IUnknown *) lpdxfeo); ok(ref == 1, "Got refcount %d, expected 1\n", ref); /* Enum object gets references to all top level objects */ ref = getRefcount( (IUnknown *) lpdxfd); ok(ref == 2, "Got refcount %d, expected 2\n", ref); ref = IDirectXFile_Release(lpDirectXFile); ok(ref == 0, "Got refcount %d, expected 0\n", ref); /* Nothing changes for all other objects */ ref = getRefcount( (IUnknown *) lpdxfeo); ok(ref == 1, "Got refcount %d, expected 1\n", ref); ref = getRefcount( (IUnknown *) lpdxfd); ok(ref == 2, "Got refcount %d, expected 2\n", ref); ref = IDirectXFileEnumObject_Release(lpdxfeo); ok(ref == 0, "Got refcount %d, expected 0\n", ref); /* Enum object releases references to all top level objects */ ref = getRefcount( (IUnknown *) lpdxfd); ok(ref == 1, "Got refcount %d, expected 1\n", ref); ref = IDirectXFileData_Release(lpdxfd); ok(ref == 0, "Got refcount %d, expected 0\n", ref);