On Wed, 01 Dec 2004 17:44:55 -0600, Robert Shearman <[EMAIL PROTECTED]> wrote:
> James Hawkins wrote:
> 
> 
> 
> >Hey all,
> >
> >It would really help me out if you could look over this patch and see
> >if I've incorrectly implemented ref-counting and DllCanUnloadNow for
> >dcompos.  I used suggestions from Rob and a sample implementation
> >written by him.  The only concern I have is that I'm not sure if all
> >of these classes are non-heap based.
> >
> >
> >
> >------------------------------------------------------------------------
> >
> >Index: dlls/dmcompos/chordmap.c
> >===================================================================
> >RCS file: /home/wine/wine/dlls/dmcompos/chordmap.c,v
> >retrieving revision 1.7
> >diff -u -r1.7 chordmap.c
> >--- dlls/dmcompos/chordmap.c   23 Aug 2004 19:39:57 -0000      1.7
> >+++ dlls/dmcompos/chordmap.c   1 Dec 2004 21:15:24 -0000
> >@@ -54,18 +54,20 @@
> >
> > ULONG WINAPI IDirectMusicChordMapImpl_IUnknown_AddRef (LPUNKNOWN iface) {
> >       ICOM_THIS_MULTI(IDirectMusicChordMapImpl, UnknownVtbl, iface);
> >-      TRACE("(%p): AddRef from %ld\n", This, This->ref);
> >-      return ++(This->ref);
> >+      TRACE("(%p): AddRef\n", This);
> >+
> >+      LockModule();
> >+
> >+      return 2; /* non-heap based object */
> > }
> >
> > ULONG WINAPI IDirectMusicChordMapImpl_IUnknown_Release (LPUNKNOWN iface) {
> >       ICOM_THIS_MULTI(IDirectMusicChordMapImpl, UnknownVtbl, iface);
> >-      ULONG ref = --This->ref;
> >-      TRACE("(%p): ReleaseRef to %ld\n", This, This->ref);
> >-      if (ref == 0) {
> >-              HeapFree(GetProcessHeap(), 0, This);
> >-      }
> >-      return ref;
> >+      TRACE("(%p): ReleaseRef\n", This);
> >+
> >+      UnlockModule();
> >+
> >+      return 1; /* non-heap based object */
> > }
> >
> >
> 
> No, this isn't a non-heap based object. The code you removed actually
> frees the object from the heap and further down in the file the
> constructor "DMUSIC_CreateDirectMusicChordMapImpl" allocates it on the
> heap. A sure sign of something being heap-based instead of non-heap
> based is that it does stuff when its ref count goes to zero, as in the
> case above.
> 
> Rob
> 

Here is the second go round at DllCanUnloadNow.  I changed LockModule
and UnlockModule to return the changed ref count.  I use this to
implement AddRef and Release for chordmaptrack.  This is just an idea
I had, so let me know if this works.


-- 
James Hawkins
Index: dlls/dmcompos/chordmap.c
===================================================================
RCS file: /home/wine/wine/dlls/dmcompos/chordmap.c,v
retrieving revision 1.7
diff -u -r1.7 chordmap.c
--- dlls/dmcompos/chordmap.c	23 Aug 2004 19:39:57 -0000	1.7
+++ dlls/dmcompos/chordmap.c	2 Dec 2004 04:03:16 -0000
@@ -54,18 +54,20 @@
 
 ULONG WINAPI IDirectMusicChordMapImpl_IUnknown_AddRef (LPUNKNOWN iface) {
 	ICOM_THIS_MULTI(IDirectMusicChordMapImpl, UnknownVtbl, iface);
-	TRACE("(%p): AddRef from %ld\n", This, This->ref);
-	return ++(This->ref);
+	TRACE("(%p): AddRef\n", This);
+	
+	LockModule();
+	
+	return 2; /* non-heap based object */
 }
 
 ULONG WINAPI IDirectMusicChordMapImpl_IUnknown_Release (LPUNKNOWN iface) {
 	ICOM_THIS_MULTI(IDirectMusicChordMapImpl, UnknownVtbl, iface);
-	ULONG ref = --This->ref;
-	TRACE("(%p): ReleaseRef to %ld\n", This, This->ref);
-	if (ref == 0) {
-		HeapFree(GetProcessHeap(), 0, This);
-	}
-	return ref;
+	TRACE("(%p): ReleaseRef\n", This);
+	
+	UnlockModule();
+	
+	return 1; /* non-heap based object */
 }
 
 IUnknownVtbl DirectMusicChordMap_Unknown_Vtbl = {
@@ -526,7 +528,6 @@
 	DM_STRUCT_INIT(obj->pDesc);
 	obj->pDesc->dwValidData |= DMUS_OBJ_CLASS;
 	memcpy (&obj->pDesc->guidClass, &CLSID_DirectMusicChordMap, sizeof (CLSID));
-	obj->ref = 0; /* will be inited by QueryInterface */
 	
 	return IDirectMusicChordMapImpl_IUnknown_QueryInterface ((LPUNKNOWN)&obj->UnknownVtbl, lpcGUID, ppobj);
 }
Index: dlls/dmcompos/chordmaptrack.c
===================================================================
RCS file: /home/wine/wine/dlls/dmcompos/chordmaptrack.c,v
retrieving revision 1.6
diff -u -r1.6 chordmaptrack.c
--- dlls/dmcompos/chordmaptrack.c	23 Aug 2004 19:39:57 -0000	1.6
+++ dlls/dmcompos/chordmaptrack.c	2 Dec 2004 04:03:16 -0000
@@ -51,18 +51,23 @@
 
 ULONG WINAPI IDirectMusicChordMapTrack_IUnknown_AddRef (LPUNKNOWN iface) {
 	ICOM_THIS_MULTI(IDirectMusicChordMapTrack, UnknownVtbl, iface);
-	TRACE("(%p): AddRef from %ld\n", This, This->ref);
-	return ++(This->ref);
+	TRACE("(%p): AddRef\n", This);
+	
+	return LockModule();
 }
 
 ULONG WINAPI IDirectMusicChordMapTrack_IUnknown_Release (LPUNKNOWN iface) {
 	ICOM_THIS_MULTI(IDirectMusicChordMapTrack, UnknownVtbl, iface);
-	ULONG ref = --This->ref;
-	TRACE("(%p): ReleaseRef to %ld\n", This, This->ref);
-	if (ref == 0) {
+	TRACE("(%p): ReleaseRef\n", This);
+	
+	LONG refCount = UnlockModule();
+	
+	if (refCount == 0)
+	{
 		HeapFree(GetProcessHeap(), 0, This);
 	}
-	return ref;
+	
+	return refCount; /* non-heap based object */
 }
 
 IUnknownVtbl DirectMusicChordMapTrack_Unknown_Vtbl = {
@@ -268,7 +273,6 @@
 	DM_STRUCT_INIT(track->pDesc);
 	track->pDesc->dwValidData |= DMUS_OBJ_CLASS;
 	memcpy (&track->pDesc->guidClass, &CLSID_DirectMusicChordMapTrack, sizeof (CLSID));
-	track->ref = 0; /* will be inited by QueryInterface */
 	
 	return IDirectMusicChordMapTrack_IUnknown_QueryInterface ((LPUNKNOWN)&track->UnknownVtbl, lpcGUID, ppobj);
 }
Index: dlls/dmcompos/composer.c
===================================================================
RCS file: /home/wine/wine/dlls/dmcompos/composer.c,v
retrieving revision 1.8
diff -u -r1.8 composer.c
--- dlls/dmcompos/composer.c	6 Sep 2004 21:34:26 -0000	1.8
+++ dlls/dmcompos/composer.c	2 Dec 2004 04:03:16 -0000
@@ -38,18 +38,20 @@
 
 ULONG WINAPI IDirectMusicComposerImpl_AddRef (LPDIRECTMUSICCOMPOSER iface) {
 	IDirectMusicComposerImpl *This = (IDirectMusicComposerImpl *)iface;
-	TRACE("(%p): AddRef from %ld\n", This, This->ref);
-	return ++(This->ref);
+	TRACE("(%p): AddRef\n", This);
+	
+	LockModule();
+	
+	return 2; /* non-heap based object */
 }
 
 ULONG WINAPI IDirectMusicComposerImpl_Release (LPDIRECTMUSICCOMPOSER iface) {
 	IDirectMusicComposerImpl *This = (IDirectMusicComposerImpl *)iface;
-	ULONG ref = --This->ref;
-	TRACE("(%p): ReleaseRef to %ld\n", This, This->ref);
-	if (ref == 0) {
-		HeapFree(GetProcessHeap(), 0, This);
-	}
-	return ref;
+	TRACE("(%p): ReleaseRef\n", This);
+	
+	UnlockModule();
+	
+	return 1; /* non-heap based object */
 }
 
 /* IDirectMusicComposerImpl IDirectMusicComposer part: */
@@ -111,7 +113,6 @@
 		return E_OUTOFMEMORY;
 	}
 	obj->lpVtbl = &DirectMusicComposer_Vtbl;
-	obj->ref = 0; /* will be inited by QueryInterface */
 	
 	return IDirectMusicComposerImpl_QueryInterface ((LPDIRECTMUSICCOMPOSER)obj, lpcGUID, ppobj);	
 }
Index: dlls/dmcompos/dmcompos_main.c
===================================================================
RCS file: /home/wine/wine/dlls/dmcompos/dmcompos_main.c,v
retrieving revision 1.9
diff -u -r1.9 dmcompos_main.c
--- dlls/dmcompos/dmcompos_main.c	6 Sep 2004 21:34:26 -0000	1.9
+++ dlls/dmcompos/dmcompos_main.c	2 Dec 2004 04:03:16 -0000
@@ -21,41 +21,54 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(dmcompos);
 
+LONG cLocks;
+
 typedef struct {
-    /* IUnknown fields */
     IClassFactoryVtbl          *lpVtbl;
-    DWORD                       ref;
 } IClassFactoryImpl;
 
 /******************************************************************
  *		DirectMusicChordMap ClassFactory
  */
 static HRESULT WINAPI ChordMapCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
-	IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
-	FIXME("(%p, %s, %p): stub\n", This, debugstr_dmguid(riid), ppobj);
+	FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid));
+	
+	if (ppobj == NULL) return E_POINTER;
+	
 	return E_NOINTERFACE;
 }
 
 static ULONG WINAPI ChordMapCF_AddRef(LPCLASSFACTORY iface) {
-	IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
-	return ++(This->ref);
+	LockModule();
+	
+	return 2; /* non-heap based object */
 }
 
 static ULONG WINAPI ChordMapCF_Release(LPCLASSFACTORY iface) {
-	IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
-	/* static class, won't be  freed */
-	return --(This->ref);
+	UnlockModule();
+	
+	return 1; /* non-heap based object */
 }
 
 static HRESULT WINAPI ChordMapCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) {
-	IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
-	TRACE ("(%p, %p, %s, %p)\n", This, pOuter, debugstr_dmguid(riid), ppobj);
-	return DMUSIC_CreateDirectMusicChordMapImpl (riid, ppobj, pOuter);
+	HRESULT result;
+	
+	TRACE ("(%p, %s, %p)\n", pOuter, debugstr_dmguid(riid), ppobj);
+	
+	result = DMUSIC_CreateDirectMusicChordMapImpl (riid, ppobj, pOuter);
+	LockModule();
+	
+	return result;
 }
 
 static HRESULT WINAPI ChordMapCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
-	IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
-	FIXME("(%p, %d): stub\n", This, dolock);
+	TRACE("(%d)\n", dolock);
+	
+	if (dolock)
+		LockModule();
+	else
+		UnlockModule();
+
 	return S_OK;
 }
 
@@ -67,37 +80,49 @@
 	ChordMapCF_LockServer
 };
 
-static IClassFactoryImpl ChordMap_CF = {&ChordMapCF_Vtbl, 1 };
+static IClassFactoryImpl ChordMap_CF = {&ChordMapCF_Vtbl};
 
 /******************************************************************
  *		DirectMusicComposer ClassFactory
  */
 static HRESULT WINAPI ComposerCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
-	IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
-	FIXME("(%p, %s, %p): stub\n",This,debugstr_dmguid(riid),ppobj);
+	FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid));
+	
+	if (ppobj == NULL) return E_POINTER;
+	
 	return E_NOINTERFACE;
 }
 
 static ULONG WINAPI ComposerCF_AddRef(LPCLASSFACTORY iface) {
-	IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
-	return ++(This->ref);
+	LockModule();
+	
+	return 2; /* non-heap based object */
 }
 
 static ULONG WINAPI ComposerCF_Release(LPCLASSFACTORY iface) {
-	IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
-	/* static class, won't be  freed */
-	return --(This->ref);
+	UnlockModule();
+	
+	return 1; /* non-heap based object */
 }
 
 static HRESULT WINAPI ComposerCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) {
-	IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
-	TRACE ("(%p, %p, %s, %p)\n", This, pOuter, debugstr_dmguid(riid), ppobj);
-	return DMUSIC_CreateDirectMusicComposerImpl (riid, ppobj, pOuter);
+	HRESULT result;
+	TRACE ("(%p, %s, %p)\n", pOuter, debugstr_dmguid(riid), ppobj);
+	
+	result = DMUSIC_CreateDirectMusicComposerImpl (riid, ppobj, pOuter);
+	LockModule();
+	
+	return result;
 }
 
 static HRESULT WINAPI ComposerCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
-	IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
-	FIXME("(%p, %d): stub\n", This, dolock);
+	TRACE("(%d)\n", dolock);
+	
+	if (dolock)
+		LockModule();
+	else
+		UnlockModule();
+
 	return S_OK;
 }
 
@@ -109,37 +134,49 @@
 	ComposerCF_LockServer
 };
 
-static IClassFactoryImpl Composer_CF = {&ComposerCF_Vtbl, 1 };
+static IClassFactoryImpl Composer_CF = {&ComposerCF_Vtbl};
 
 /******************************************************************
  *		DirectMusicChordMapTrack ClassFactory
  */
 static HRESULT WINAPI ChordMapTrackCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
-	IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
-	FIXME("(%p, %s, %p): stub\n",This,debugstr_dmguid(riid),ppobj);
+	FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid));
+	
+	if (ppobj == NULL) return E_POINTER;
+	
 	return E_NOINTERFACE;
 }
 
 static ULONG WINAPI ChordMapTrackCF_AddRef(LPCLASSFACTORY iface) {
-	IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
-	return ++(This->ref);
+	LockModule();
+	
+	return 2; /* non-heap based object */
 }
 
 static ULONG WINAPI ChordMapTrackCF_Release(LPCLASSFACTORY iface) {
-	IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
-	/* static class, won't be  freed */
-	return --(This->ref);
+	UnlockModule();
+	
+	return 1; /* non-heap based object */
 }
 
 static HRESULT WINAPI ChordMapTrackCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) {
-	IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
-	TRACE ("(%p, %p, %s, %p)\n", This, pOuter, debugstr_dmguid(riid), ppobj);
-	return DMUSIC_CreateDirectMusicChordMapTrack (riid, ppobj, pOuter);
+	HRESULT result;
+	TRACE ("(%p, %s, %p)\n", pOuter, debugstr_dmguid(riid), ppobj);
+	
+	result = DMUSIC_CreateDirectMusicChordMapTrack (riid, ppobj, pOuter);
+	LockModule();
+	
+	return result;
 }
 
 static HRESULT WINAPI ChordMapTrackCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
-	IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
-	FIXME("(%p, %d): stub\n", This, dolock);
+	TRACE("(%d)\n", dolock);
+	
+	if (dolock)
+		LockModule();
+	else
+		UnlockModule();
+
 	return S_OK;
 }
 
@@ -151,39 +188,49 @@
 	ChordMapTrackCF_LockServer
 };
 
-static IClassFactoryImpl ChordMapTrack_CF = {&ChordMapTrackCF_Vtbl, 1 };
+static IClassFactoryImpl ChordMapTrack_CF = {&ChordMapTrackCF_Vtbl};
 
 /******************************************************************
  *		DirectMusicTemplate ClassFactory
  */
 static HRESULT WINAPI TemplateCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
-	IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
-	FIXME("(%p, %s, %p): stub\n", This, debugstr_dmguid(riid), ppobj);
+	FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid));
+	
+	if (ppobj == NULL) return E_POINTER;
+	
 	return E_NOINTERFACE;
 }
 
 static ULONG WINAPI TemplateCF_AddRef(LPCLASSFACTORY iface) {
-	IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
-	return ++(This->ref);
+	LockModule();
+	
+	return 2; /* non-heap based object */
 }
 
 static ULONG WINAPI TemplateCF_Release(LPCLASSFACTORY iface) {
-	IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
-	/* static class, won't be  freed */
-	return --(This->ref);
+	UnlockModule();
+	
+	return 1; /* non-heap based object */
 }
 
 static HRESULT WINAPI TemplateCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) {
-	IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
-	TRACE ("(%p, %p, %s, %p)\n", This, pOuter, debugstr_dmguid(riid), ppobj);
+	TRACE ("(%p, %s, %p)\n", pOuter, debugstr_dmguid(riid), ppobj);
 	/* nothing yet */
-	WARN("(%p, %s,%p): not found\n", This, debugstr_dmguid(riid), ppobj);
+	WARN("(%s,%p): not found\n", debugstr_dmguid(riid), ppobj);
+	
+	LockModule();
+	
 	return E_NOINTERFACE;
 }
 
 static HRESULT WINAPI TemplateCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
-	IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
-	FIXME("(%p, %d): stub\n", This, dolock);
+	TRACE("(%d)\n", dolock);
+	
+	if (dolock)
+		LockModule();
+	else
+		UnlockModule();
+
 	return S_OK;
 }
 
@@ -195,37 +242,49 @@
 	TemplateCF_LockServer
 };
 
-static IClassFactoryImpl Template_CF = {&TemplateCF_Vtbl, 1 };
+static IClassFactoryImpl Template_CF = {&TemplateCF_Vtbl};
 
 /******************************************************************
  *		DirectMusicSignPostTrack ClassFactory
  */
 static HRESULT WINAPI SignPostTrackCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
-	IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
-	FIXME("(%p, %s, %p): stub\n",This,debugstr_dmguid(riid),ppobj);
+	FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid));
+	
+	if (ppobj == NULL) return E_POINTER;
+	
 	return E_NOINTERFACE;
 }
 
 static ULONG WINAPI SignPostTrackCF_AddRef(LPCLASSFACTORY iface) {
-	IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
-	return ++(This->ref);
+	LockModule();
+	
+	return 2; /* non-heap based object */
 }
 
 static ULONG WINAPI SignPostTrackCF_Release(LPCLASSFACTORY iface) {
-	IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
-	/* static class, won't be  freed */
-	return --(This->ref);
+	UnlockModule();
+	
+	return 1; /* non-heap based object */
 }
 
 static HRESULT WINAPI SignPostTrackCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) {
-	IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
-	TRACE ("(%p, %p, %s, %p)\n", This, pOuter, debugstr_dmguid(riid), ppobj);
-	return DMUSIC_CreateDirectMusicSignPostTrack (riid, ppobj, pOuter);
+	HRESULT result;
+	TRACE ("(%p, %s, %p)\n", pOuter, debugstr_dmguid(riid), ppobj);
+	
+	result = DMUSIC_CreateDirectMusicSignPostTrack (riid, ppobj, pOuter);
+	LockModule();
+	
+	return result;
 }
 
 static HRESULT WINAPI SignPostTrackCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
-	IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
-	FIXME("(%p, %d): stub\n", This, dolock);
+	TRACE("(%d)\n", dolock);
+	
+	if (dolock)
+		LockModule();
+	else
+		UnlockModule();
+
 	return S_OK;
 }
 
@@ -237,7 +296,7 @@
 	SignPostTrackCF_LockServer
 };
 
-static IClassFactoryImpl SignPostTrack_CF = {&SignPostTrackCF_Vtbl, 1 };
+static IClassFactoryImpl SignPostTrack_CF = {&SignPostTrackCF_Vtbl};
 
 /******************************************************************
  *		DllMain
@@ -256,6 +315,22 @@
 	return TRUE;
 }
 
+/**********************************************************************
+ * Dll lifetime tracking declaration
+ */
+LONG LockModule()
+{
+    InterlockedIncrement(&cLocks);
+    
+    return cLocks;
+}
+
+LONG UnlockModule()
+{
+    InterlockedDecrement(&cLocks);
+    
+    return cLocks;
+}
 
 /******************************************************************
  *		DllCanUnloadNow (DMCOMPOS.1)
@@ -263,8 +338,7 @@
  *
  */
 HRESULT WINAPI DMCOMPOS_DllCanUnloadNow(void) {
-    FIXME("(void): stub\n");
-    return S_FALSE;
+    return cLocks != 0 ? S_FALSE : S_OK;
 }
 
 
Index: dlls/dmcompos/dmcompos_private.h
===================================================================
RCS file: /home/wine/wine/dlls/dmcompos/dmcompos_private.h,v
retrieving revision 1.10
diff -u -r1.10 dmcompos_private.h
--- dlls/dmcompos/dmcompos_private.h	22 Aug 2004 21:38:47 -0000	1.10
+++ dlls/dmcompos/dmcompos_private.h	2 Dec 2004 04:03:16 -0000
@@ -85,7 +85,6 @@
   IDirectMusicChordMapVtbl *ChordMapVtbl;
   IDirectMusicObjectVtbl *ObjectVtbl;
   IPersistStreamVtbl *PersistStreamVtbl;
-  DWORD ref;
 
   /* IDirectMusicChordMapImpl fields */
   LPDMUS_OBJECTDESC pDesc;
@@ -124,7 +123,6 @@
 struct IDirectMusicComposerImpl {
   /* IUnknown fields */
   IDirectMusicComposerVtbl *lpVtbl;
-  DWORD ref;
 
   /* IDirectMusicComposerImpl fields */
 };
@@ -134,11 +132,11 @@
 extern ULONG WINAPI   IDirectMusicComposerImpl_AddRef (LPDIRECTMUSICCOMPOSER iface);
 extern ULONG WINAPI   IDirectMusicComposerImpl_Release (LPDIRECTMUSICCOMPOSER iface);
 /* IDirectMusicComposer: */
-extern HRESULT WINAPI IDirectMusicComposerImpl_ComposeSegmentFromTemplate (LPDIRECTMUSICCOMPOSER iface, IDirectMusicStyle* pStyle, IDirectMusicSegment* pTemplate, WORD wActivity, IDirectMusicChordMap* pChordMap, IDirectMusicSegment** ppSegment);
-extern HRESULT WINAPI IDirectMusicComposerImpl_ComposeSegmentFromShape (LPDIRECTMUSICCOMPOSER iface, IDirectMusicStyle* pStyle, WORD wNumMeasures, WORD wShape, WORD wActivity, BOOL fIntro, BOOL fEnd, IDirectMusicChordMap* pChordMap, IDirectMusicSegment** ppSegment);
-extern HRESULT WINAPI IDirectMusicComposerImpl_ComposeTransition (LPDIRECTMUSICCOMPOSER iface, IDirectMusicSegment* pFromSeg, IDirectMusicSegment* pToSeg, MUSIC_TIME mtTime, WORD wCommand, DWORD dwFlags, IDirectMusicChordMap* pChordMap, IDirectMusicSegment** ppTransSeg);
-extern HRESULT WINAPI IDirectMusicComposerImpl_AutoTransition (LPDIRECTMUSICCOMPOSER iface, IDirectMusicPerformance* pPerformance, IDirectMusicSegment* pToSeg, WORD wCommand, DWORD dwFlags, IDirectMusicChordMap* pChordMap, IDirectMusicSegment** ppTransSeg, IDirectMusicSegmentState** ppToSegState, IDirectMusicSegmentState** ppTransSegState);
-extern HRESULT WINAPI IDirectMusicComposerImpl_ComposeTemplateFromShape (LPDIRECTMUSICCOMPOSER iface, WORD wNumMeasures, WORD wShape, BOOL fIntro, BOOL fEnd, WORD wEndLength, IDirectMusicSegment** ppTemplate);
+extern HRESULT WINAPI IDirectMusicComposerImpl_ComposeSegmentFromTemplate (LPDIRECTMUSICCOMPOSER iface, IDirectMusicStyle* pStyle, IDirectMusicSegment* pTemplate, WORD wActivity, IDirectMusicChordMap* pChordMap, IDirectMusicSegment** ppSegment);
+extern HRESULT WINAPI IDirectMusicComposerImpl_ComposeSegmentFromShape (LPDIRECTMUSICCOMPOSER iface, IDirectMusicStyle* pStyle, WORD wNumMeasures, WORD wShape, WORD wActivity, BOOL fIntro, BOOL fEnd, IDirectMusicChordMap* pChordMap, IDirectMusicSegment** ppSegment);
+extern HRESULT WINAPI IDirectMusicComposerImpl_ComposeTransition (LPDIRECTMUSICCOMPOSER iface, IDirectMusicSegment* pFromSeg, IDirectMusicSegment* pToSeg, MUSIC_TIME mtTime, WORD wCommand, DWORD dwFlags, IDirectMusicChordMap* pChordMap, IDirectMusicSegment** ppTransSeg);
+extern HRESULT WINAPI IDirectMusicComposerImpl_AutoTransition (LPDIRECTMUSICCOMPOSER iface, IDirectMusicPerformance* pPerformance, IDirectMusicSegment* pToSeg, WORD wCommand, DWORD dwFlags, IDirectMusicChordMap* pChordMap, IDirectMusicSegment** ppTransSeg, IDirectMusicSegmentState** ppToSegState, IDirectMusicSegmentState** ppTransSegState);
+extern HRESULT WINAPI IDirectMusicComposerImpl_ComposeTemplateFromShape (LPDIRECTMUSICCOMPOSER iface, WORD wNumMeasures, WORD wShape, BOOL fIntro, BOOL fEnd, WORD wEndLength, IDirectMusicSegment** ppTemplate);
 extern HRESULT WINAPI IDirectMusicComposerImpl_ChangeChordMap (LPDIRECTMUSICCOMPOSER iface, IDirectMusicSegment* pSegment, BOOL fTrackScale, IDirectMusicChordMap* pChordMap);
 
 
@@ -150,7 +148,6 @@
   IUnknownVtbl *UnknownVtbl;
   IDirectMusicTrack8Vtbl *TrackVtbl;
   IPersistStreamVtbl *PersistStreamVtbl;
-  DWORD          ref;
 
   /* IDirectMusicChordMapTrack fields */
   LPDMUS_OBJECTDESC pDesc;
@@ -198,7 +195,6 @@
   IUnknownVtbl *UnknownVtbl;
   IDirectMusicTrack8Vtbl *TrackVtbl;
   IPersistStreamVtbl *PersistStreamVtbl;
-  DWORD          ref;
 
   /* IDirectMusicSignPostTrack fields */
   LPDMUS_OBJECTDESC pDesc;
@@ -237,6 +233,11 @@
 extern HRESULT WINAPI IDirectMusicSignPostTrack_IPersistStream_Save (LPPERSISTSTREAM iface, IStream* pStm, BOOL fClearDirty);
 extern HRESULT WINAPI IDirectMusicSignPostTrack_IPersistStream_GetSizeMax (LPPERSISTSTREAM iface, ULARGE_INTEGER* pcbSize);
 
+/**********************************************************************
+ * Dll lifetime tracking declaration for devenum.dll
+ */
+LONG LockModule();
+LONG UnlockModule();
 
 /*****************************************************************************
  * Misc.
Index: dlls/dmcompos/signposttrack.c
===================================================================
RCS file: /home/wine/wine/dlls/dmcompos/signposttrack.c,v
retrieving revision 1.7
diff -u -r1.7 signposttrack.c
--- dlls/dmcompos/signposttrack.c	6 Sep 2004 21:34:26 -0000	1.7
+++ dlls/dmcompos/signposttrack.c	2 Dec 2004 04:03:16 -0000
@@ -51,18 +51,20 @@
 
 ULONG WINAPI IDirectMusicSignPostTrack_IUnknown_AddRef (LPUNKNOWN iface) {
 	ICOM_THIS_MULTI(IDirectMusicSignPostTrack, UnknownVtbl, iface);
-	TRACE("(%p): AddRef from %ld\n", This, This->ref);
-	return ++(This->ref);
+	TRACE("(%p): AddRef\n", This);
+	
+	LockModule();
+	
+	return 2; /* non-heap based object */
 }
 
 ULONG WINAPI IDirectMusicSignPostTrack_IUnknown_Release (LPUNKNOWN iface) {
 	ICOM_THIS_MULTI(IDirectMusicSignPostTrack, UnknownVtbl, iface);
-	ULONG ref = --This->ref;
-	TRACE("(%p): ReleaseRef to %ld\n", This, This->ref);
-	if (ref == 0) {
-		HeapFree(GetProcessHeap(), 0, This);
-	}
-	return ref;
+	TRACE("(%p): ReleaseRef\n", This);
+	
+	UnlockModule();
+	
+	return 1; /* non-heap based object */
 }
 
 IUnknownVtbl DirectMusicSignPostTrack_Unknown_Vtbl = {
@@ -266,7 +268,6 @@
 	DM_STRUCT_INIT(track->pDesc);
 	track->pDesc->dwValidData |= DMUS_OBJ_CLASS;
 	memcpy (&track->pDesc->guidClass, &CLSID_DirectMusicSignPostTrack, sizeof (CLSID));
-	track->ref = 0; /* will be inited by QueryInterface */
 	
 	return IDirectMusicSignPostTrack_IUnknown_QueryInterface ((LPUNKNOWN)&track->UnknownVtbl, lpcGUID, ppobj);
 }

Reply via email to