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