// // dmstydll.cpp // // Copyright (c) 1997-1999 Microsoft Corporation // // Note: Dll entry points as well as Class Factory implementations. // // READ THIS!!!!!!!!!!!!!!!!!!!!!!!!!!! // // 4530: C++ exception handler used, but unwind semantics are not enabled. Specify -GX // // We disable this because we use exceptions and do *not* specify -GX (USE_NATIVE_EH in // sources). // // The one place we use exceptions is around construction of objects that call // InitializeCriticalSection. We guarantee that it is safe to use in this case with // the restriction given by not using -GX (automatic objects in the call chain between // throw and handler are not destructed). Turning on -GX buys us nothing but +10% to code // size because of the unwind code. // // Any other use of exceptions must follow these restrictions or -GX must be turned on. // // READ THIS!!!!!!!!!!!!!!!!!!!!!!!!!!! // #pragma warning(disable:4530) #include #include "debug.h" #include "debug.h" #include "..\shared\oledll.h" #include #include "dmusici.h" #include "DMStyleP.h" #include "dmstyle.h" #include "dmsect.h" #include "chordtrk.h" #include "cmmdtrk.h" #include "styletrk.h" #include "motiftrk.h" #include "audtrk.h" #include "mutetrk.h" #include "mgentrk.h" #include "..\dmband\dmbndtrk.h" #include "..\shared\Validate.h" #include "..\shared\dmscriptautguids.h" ////////////////////////////////////////////////////////////////////// // Globals // Version information // TCHAR g_szStyleFriendlyName[] = TEXT("DirectMusicStyle"); TCHAR g_szStyleVerIndProgID[] = TEXT("Microsoft.DirectMusicStyle"); TCHAR g_szStyleProgID[] = TEXT("Microsoft.DirectMusicStyle.1"); TCHAR g_szSectionFriendlyName[] = TEXT("DirectMusicSection"); TCHAR g_szSectionVerIndProgID[] = TEXT("Microsoft.DirectMusicSection"); TCHAR g_szSectionProgID[] = TEXT("Microsoft.DirectMusicSection.1"); TCHAR g_szChordTrackFriendlyName[] = TEXT("DirectMusicChordTrack"); TCHAR g_szChordTrackVerIndProgID[] = TEXT("Microsoft.DirectMusicChordTrack"); TCHAR g_szChordTrackProgID[] = TEXT("Microsoft.DirectMusicChordTrack.1"); TCHAR g_szCommandTrackFriendlyName[] = TEXT("DirectMusicCommandTrack"); TCHAR g_szCommandTrackVerIndProgID[] = TEXT("Microsoft.DirectMusicCommandTrack"); TCHAR g_szCommandTrackProgID[] = TEXT("Microsoft.DirectMusicCommandTrack.1"); TCHAR g_szStyleTrackFriendlyName[] = TEXT("DirectMusicStyleTrack"); TCHAR g_szStyleTrackVerIndProgID[] = TEXT("Microsoft.DirectMusicStyleTrack"); TCHAR g_szStyleTrackProgID[] = TEXT("Microsoft.DirectMusicStyleTrack.1"); TCHAR g_szMotifTrackFriendlyName[] = TEXT("DirectMusicMotifTrack"); TCHAR g_szMotifTrackVerIndProgID[] = TEXT("Microsoft.DirectMusicMotifTrack"); TCHAR g_szMotifTrackProgID[] = TEXT("Microsoft.DirectMusicMotifTrack.1"); TCHAR g_szMuteTrackFriendlyName[] = TEXT("DirectMusicMuteTrack"); TCHAR g_szMuteTrackVerIndProgID[] = TEXT("Microsoft.DirectMusicMuteTrack"); TCHAR g_szMuteTrackProgID[] = TEXT("Microsoft.DirectMusicMuteTrack.1"); TCHAR g_szAuditionTrackFriendlyName[] = TEXT("DirectMusicAuditionTrack"); TCHAR g_szAuditionTrackVerIndProgID[] = TEXT("Microsoft.DirectMusicAuditionTrack"); TCHAR g_szAuditionTrackProgID[] = TEXT("Microsoft.DirectMusicAuditionTrack.1"); TCHAR g_szMelGenTrackFriendlyName[] = TEXT("DirectMusicMelodyFormulationTrack"); TCHAR g_szMelGenTrackVerIndProgID[] = TEXT("Microsoft.DirectMusicMelodyFormulationTrack"); TCHAR g_szMelGenTrackProgID[] = TEXT("Microsoft.DirectMusicMelodyFormulationTrack.1"); // Dll's hModule // HMODULE g_hModule = NULL; // Count of active components and class factory server locks // long g_cComponent = 0; long g_cLock = 0; ////////////////////////////////////////////////////////////////////// // CDirectMusicStyleFactory::QueryInterface HRESULT __stdcall CDirectMusicStyleFactory::QueryInterface(const IID &iid, void **ppv) { V_INAME(CDirectMusicStyleFactory::QueryInterface); V_PTRPTR_WRITE(ppv); V_REFGUID(iid); if (iid == IID_IUnknown || iid == IID_IClassFactory) { *ppv = static_cast(this); } else { *ppv = NULL; return E_NOINTERFACE; } reinterpret_cast(*ppv)->AddRef(); return S_OK; } ////////////////////////////////////////////////////////////////////// // CDirectMusicStyleFactory::AddRef ULONG __stdcall CDirectMusicStyleFactory::AddRef() { return InterlockedIncrement(&m_cRef); } ////////////////////////////////////////////////////////////////////// // CDirectMusicStyleFactory::Release ULONG __stdcall CDirectMusicStyleFactory::Release() { if (!InterlockedDecrement(&m_cRef)) { delete this; return 0; } return m_cRef; } ////////////////////////////////////////////////////////////////////// // CDirectMusicStyleFactory::CreateInstance HRESULT __stdcall CDirectMusicStyleFactory::CreateInstance(IUnknown* pUnknownOuter, const IID& iid, void** ppv) { HRESULT hr; if (pUnknownOuter) { return CLASS_E_NOAGGREGATION; } CDMStyle *pDM; try { pDM = new CDMStyle; } catch( ... ) { return E_OUTOFMEMORY; } if (pDM == NULL) { return E_OUTOFMEMORY; } hr = pDM->QueryInterface(iid, ppv); pDM->Release(); return hr; } ////////////////////////////////////////////////////////////////////// // CDirectMusicStyleFactory::LockServer HRESULT __stdcall CDirectMusicStyleFactory::LockServer(BOOL bLock) { if (bLock) { InterlockedIncrement(&g_cLock); } else { InterlockedDecrement(&g_cLock); } return S_OK; } ////////////////////////////////////////////////////////////////////// // CDirectMusicSectionFactory::QueryInterface HRESULT __stdcall CDirectMusicSectionFactory::QueryInterface(const IID &iid, void **ppv) { V_INAME(CDirectMusicSectionFactory::QueryInterface); V_PTRPTR_WRITE(ppv); V_REFGUID(iid); if (iid == IID_IUnknown || iid == IID_IClassFactory) { *ppv = static_cast(this); } else { *ppv = NULL; return E_NOINTERFACE; } reinterpret_cast(*ppv)->AddRef(); return S_OK; } ////////////////////////////////////////////////////////////////////// // CDirectMusicSectionFactory::AddRef ULONG __stdcall CDirectMusicSectionFactory::AddRef() { return InterlockedIncrement(&m_cRef); } ////////////////////////////////////////////////////////////////////// // CDirectMusicSectionFactory::Release ULONG __stdcall CDirectMusicSectionFactory::Release() { if (!InterlockedDecrement(&m_cRef)) { delete this; return 0; } return m_cRef; } ////////////////////////////////////////////////////////////////////// // CDirectMusicSectionFactory::CreateInstance HRESULT __stdcall CDirectMusicSectionFactory::CreateInstance(IUnknown* pUnknownOuter, const IID& iid, void** ppv) { HRESULT hr; // DebugBreak(); if (pUnknownOuter) { return CLASS_E_NOAGGREGATION; } CDMSection *pDM = new CDMSection; if (pDM == NULL) { return E_OUTOFMEMORY; } hr = pDM->QueryInterface(iid, ppv); pDM->Release(); return hr; } ////////////////////////////////////////////////////////////////////// // CDirectMusicSectionFactory::LockServer HRESULT __stdcall CDirectMusicSectionFactory::LockServer(BOOL bLock) { if (bLock) { InterlockedIncrement(&g_cLock); } else { InterlockedDecrement(&g_cLock); } return S_OK; } ////////////////////////////////////////////////////////////////////// // CDirectMusicStyleTrackFactory::QueryInterface HRESULT __stdcall CDirectMusicStyleTrackFactory::QueryInterface(const IID &iid, void **ppv) { V_INAME(CDirectMusicStyleTrackFactory::QueryInterface); V_PTRPTR_WRITE(ppv); V_REFGUID(iid); if (iid == IID_IUnknown || iid == IID_IClassFactory) { *ppv = static_cast(this); } else { *ppv = NULL; return E_NOINTERFACE; } reinterpret_cast(*ppv)->AddRef(); return S_OK; } ////////////////////////////////////////////////////////////////////// // CDirectMusicStyleTrackFactory::AddRef ULONG __stdcall CDirectMusicStyleTrackFactory::AddRef() { return InterlockedIncrement(&m_cRef); } ////////////////////////////////////////////////////////////////////// // CDirectMusicStyleTrackFactory::Release ULONG __stdcall CDirectMusicStyleTrackFactory::Release() { if (!InterlockedDecrement(&m_cRef)) { delete this; return 0; } return m_cRef; } ////////////////////////////////////////////////////////////////////// // CDirectMusicStyleTrackFactory::CreateInstance HRESULT __stdcall CDirectMusicStyleTrackFactory::CreateInstance(IUnknown* pUnknownOuter, const IID& iid, void** ppv) { HRESULT hr; // DebugBreak(); if (pUnknownOuter) { return CLASS_E_NOAGGREGATION; } CStyleTrack *pDM; try { pDM = new CStyleTrack; } catch( ... ) { return E_OUTOFMEMORY; } if (pDM == NULL) { return E_OUTOFMEMORY; } hr = pDM->QueryInterface(iid, ppv); pDM->Release(); return hr; } ////////////////////////////////////////////////////////////////////// // CDirectMusicStyleTrackFactory::LockServer HRESULT __stdcall CDirectMusicStyleTrackFactory::LockServer(BOOL bLock) { if (bLock) { InterlockedIncrement(&g_cLock); } else { InterlockedDecrement(&g_cLock); } return S_OK; } ////////////////////////////////////////////////////////////////////// // CDirectMusicCommandTrackFactory::QueryInterface HRESULT __stdcall CDirectMusicCommandTrackFactory::QueryInterface(const IID &iid, void **ppv) { V_INAME(CDirectMusicCommandTrackFactory::QueryInterface); V_PTRPTR_WRITE(ppv); V_REFGUID(iid); if (iid == IID_IUnknown || iid == IID_IClassFactory) { *ppv = static_cast(this); } else { *ppv = NULL; return E_NOINTERFACE; } reinterpret_cast(*ppv)->AddRef(); return S_OK; } ////////////////////////////////////////////////////////////////////// // CDirectMusicCommandTrackFactory::AddRef ULONG __stdcall CDirectMusicCommandTrackFactory::AddRef() { return InterlockedIncrement(&m_cRef); } ////////////////////////////////////////////////////////////////////// // CDirectMusicCommandTrackFactory::Release ULONG __stdcall CDirectMusicCommandTrackFactory::Release() { if (!InterlockedDecrement(&m_cRef)) { delete this; return 0; } return m_cRef; } ////////////////////////////////////////////////////////////////////// // CDirectMusicCommandTrackFactory::CreateInstance HRESULT __stdcall CDirectMusicCommandTrackFactory::CreateInstance(IUnknown* pUnknownOuter, const IID& iid, void** ppv) { HRESULT hr; // DebugBreak(); if (pUnknownOuter) { return CLASS_E_NOAGGREGATION; } CCommandTrack *pDM; try { pDM = new CCommandTrack; } catch( ... ) { return E_OUTOFMEMORY; } if (pDM == NULL) { return E_OUTOFMEMORY; } hr = pDM->QueryInterface(iid, ppv); pDM->Release(); return hr; } ////////////////////////////////////////////////////////////////////// // CDirectMusicCommandTrackFactory::LockServer HRESULT __stdcall CDirectMusicCommandTrackFactory::LockServer(BOOL bLock) { if (bLock) { InterlockedIncrement(&g_cLock); } else { InterlockedDecrement(&g_cLock); } return S_OK; } ////////////////////////////////////////////////////////////////////// // CDirectMusicChordTrackFactory::QueryInterface HRESULT __stdcall CDirectMusicChordTrackFactory::QueryInterface(const IID &iid, void **ppv) { V_INAME(CDirectMusicChordTrackFactory::QueryInterface); V_PTRPTR_WRITE(ppv); V_REFGUID(iid); if (iid == IID_IUnknown || iid == IID_IClassFactory) { *ppv = static_cast(this); } else { *ppv = NULL; return E_NOINTERFACE; } reinterpret_cast(*ppv)->AddRef(); return S_OK; } ////////////////////////////////////////////////////////////////////// // CDirectMusicChordTrackFactory::AddRef ULONG __stdcall CDirectMusicChordTrackFactory::AddRef() { return InterlockedIncrement(&m_cRef); } ////////////////////////////////////////////////////////////////////// // CDirectMusicChordTrackFactory::Release ULONG __stdcall CDirectMusicChordTrackFactory::Release() { if (!InterlockedDecrement(&m_cRef)) { delete this; return 0; } return m_cRef; } ////////////////////////////////////////////////////////////////////// // CDirectMusicChordTrackFactory::CreateInstance HRESULT __stdcall CDirectMusicChordTrackFactory::CreateInstance(IUnknown* pUnknownOuter, const IID& iid, void** ppv) { HRESULT hr; // DebugBreak(); if (pUnknownOuter) { return CLASS_E_NOAGGREGATION; } CChordTrack *pDM; try { pDM = new CChordTrack; } catch( ... ) { return E_OUTOFMEMORY; } if (pDM == NULL) { return E_OUTOFMEMORY; } hr = pDM->QueryInterface(iid, ppv); pDM->Release(); return hr; } ////////////////////////////////////////////////////////////////////// // CDirectMusicChordTrackFactory::LockServer HRESULT __stdcall CDirectMusicChordTrackFactory::LockServer(BOOL bLock) { if (bLock) { InterlockedIncrement(&g_cLock); } else { InterlockedDecrement(&g_cLock); } return S_OK; } /////////////////////////////////////////////////////////////////////// // CDirectMusicMotifTrackFactory::QueryInterface HRESULT __stdcall CDirectMusicMotifTrackFactory::QueryInterface(const IID &iid, void **ppv) { V_INAME(CDirectMusicMotifTrackFactory::QueryInterface); V_PTRPTR_WRITE(ppv); V_REFGUID(iid); if (iid == IID_IUnknown || iid == IID_IClassFactory) { *ppv = static_cast(this); } else { *ppv = NULL; return E_NOINTERFACE; } reinterpret_cast(*ppv)->AddRef(); return S_OK; } ////////////////////////////////////////////////////////////////////// // CDirectMusicMotifTrackFactory::AddRef ULONG __stdcall CDirectMusicMotifTrackFactory::AddRef() { return InterlockedIncrement(&m_cRef); } ////////////////////////////////////////////////////////////////////// // CDirectMusicMotifTrackFactory::Release ULONG __stdcall CDirectMusicMotifTrackFactory::Release() { if (!InterlockedDecrement(&m_cRef)) { delete this; return 0; } return m_cRef; } ////////////////////////////////////////////////////////////////////// // CDirectMusicMotifTrackFactory::CreateInstance HRESULT __stdcall CDirectMusicMotifTrackFactory::CreateInstance(IUnknown* pUnknownOuter, const IID& iid, void** ppv) { HRESULT hr; // DebugBreak(); if (pUnknownOuter) { return CLASS_E_NOAGGREGATION; } CMotifTrack *pDM; try { pDM = new CMotifTrack; } catch( ... ) { return E_OUTOFMEMORY; } if (pDM == NULL) { return E_OUTOFMEMORY; } hr = pDM->QueryInterface(iid, ppv); pDM->Release(); return hr; } ////////////////////////////////////////////////////////////////////// // CDirectMusicMotifTrackFactory::LockServer HRESULT __stdcall CDirectMusicMotifTrackFactory::LockServer(BOOL bLock) { if (bLock) { InterlockedIncrement(&g_cLock); } else { InterlockedDecrement(&g_cLock); } return S_OK; } ////////////////////////////////////////////////////////////////////// // CDirectMusicMuteTrackFactory::QueryInterface HRESULT __stdcall CDirectMusicMuteTrackFactory::QueryInterface(const IID &iid, void **ppv) { V_INAME(CDirectMusicMuteTrackFactory::QueryInterface); V_PTRPTR_WRITE(ppv); V_REFGUID(iid); if (iid == IID_IUnknown || iid == IID_IClassFactory) { *ppv = static_cast(this); } else { *ppv = NULL; return E_NOINTERFACE; } reinterpret_cast(*ppv)->AddRef(); return S_OK; } ////////////////////////////////////////////////////////////////////// // CDirectMusicMuteTrackFactory::AddRef ULONG __stdcall CDirectMusicMuteTrackFactory::AddRef() { return InterlockedIncrement(&m_cRef); } ////////////////////////////////////////////////////////////////////// // CDirectMusicMuteTrackFactory::Release ULONG __stdcall CDirectMusicMuteTrackFactory::Release() { if (!InterlockedDecrement(&m_cRef)) { delete this; return 0; } return m_cRef; } ////////////////////////////////////////////////////////////////////// // CDirectMusicMuteTrackFactory::CreateInstance HRESULT __stdcall CDirectMusicMuteTrackFactory::CreateInstance(IUnknown* pUnknownOuter, const IID& iid, void** ppv) { HRESULT hr; // DebugBreak(); if (pUnknownOuter) { return CLASS_E_NOAGGREGATION; } CMuteTrack *pDM; try { pDM = new CMuteTrack; } catch( ... ) { pDM = NULL; } if (pDM == NULL) { return E_OUTOFMEMORY; } hr = pDM->QueryInterface(iid, ppv); pDM->Release(); return hr; } ////////////////////////////////////////////////////////////////////// // CDirectMusicMuteTrackFactory::LockServer HRESULT __stdcall CDirectMusicMuteTrackFactory::LockServer(BOOL bLock) { if (bLock) { InterlockedIncrement(&g_cLock); } else { InterlockedDecrement(&g_cLock); } return S_OK; } ///////////////////////////////////////////////////////////////////// // CDirectMusicAuditionTrackFactory::QueryInterface HRESULT __stdcall CDirectMusicAuditionTrackFactory::QueryInterface(const IID &iid, void **ppv) { V_INAME(CDirectMusicAuditionTrackFactory::QueryInterface); V_PTRPTR_WRITE(ppv); V_REFGUID(iid); if (iid == IID_IUnknown || iid == IID_IClassFactory) { *ppv = static_cast(this); } else { *ppv = NULL; return E_NOINTERFACE; } reinterpret_cast(*ppv)->AddRef(); return S_OK; } ////////////////////////////////////////////////////////////////////// // CDirectMusicAuditionTrackFactory::AddRef ULONG __stdcall CDirectMusicAuditionTrackFactory::AddRef() { return InterlockedIncrement(&m_cRef); } ////////////////////////////////////////////////////////////////////// // CDirectMusicAuditionTrackFactory::Release ULONG __stdcall CDirectMusicAuditionTrackFactory::Release() { if (!InterlockedDecrement(&m_cRef)) { delete this; return 0; } return m_cRef; } ////////////////////////////////////////////////////////////////////// // CDirectMusicAuditionTrackFactory::CreateInstance HRESULT __stdcall CDirectMusicAuditionTrackFactory::CreateInstance(IUnknown* pUnknownOuter, const IID& iid, void** ppv) { HRESULT hr; if (pUnknownOuter) { return CLASS_E_NOAGGREGATION; } CAuditionTrack *pDM; try { pDM = new CAuditionTrack; } catch( ... ) { return E_OUTOFMEMORY; } if (pDM == NULL) { return E_OUTOFMEMORY; } hr = pDM->QueryInterface(iid, ppv); pDM->Release(); return hr; } ////////////////////////////////////////////////////////////////////// // CDirectMusicAuditionTrackFactory::LockServer HRESULT __stdcall CDirectMusicAuditionTrackFactory::LockServer(BOOL bLock) { if (bLock) { InterlockedIncrement(&g_cLock); } else { InterlockedDecrement(&g_cLock); } return S_OK; } ////////////////////////////////////////////////////////////////////// // CDirectMusicMelodyFormulationTrackFactory::QueryInterface HRESULT __stdcall CDirectMusicMelodyFormulationTrackFactory::QueryInterface(const IID &iid, void **ppv) { V_INAME(CDirectMusicMelodyFormulationTrackFactory::QueryInterface); V_PTRPTR_WRITE(ppv); V_REFGUID(iid); if (iid == IID_IUnknown || iid == IID_IClassFactory) { *ppv = static_cast(this); } else { *ppv = NULL; return E_NOINTERFACE; } reinterpret_cast(*ppv)->AddRef(); return S_OK; } ////////////////////////////////////////////////////////////////////// // CDirectMusicMelodyFormulationTrackFactory::AddRef ULONG __stdcall CDirectMusicMelodyFormulationTrackFactory::AddRef() { return InterlockedIncrement(&m_cRef); } ////////////////////////////////////////////////////////////////////// // CDirectMusicMelodyFormulationTrackFactory::Release ULONG __stdcall CDirectMusicMelodyFormulationTrackFactory::Release() { if (!InterlockedDecrement(&m_cRef)) { delete this; return 0; } return m_cRef; } ////////////////////////////////////////////////////////////////////// // CDirectMusicMelodyFormulationTrackFactory::CreateInstance HRESULT __stdcall CDirectMusicMelodyFormulationTrackFactory::CreateInstance(IUnknown* pUnknownOuter, const IID& iid, void** ppv) { HRESULT hr; if (pUnknownOuter) { return CLASS_E_NOAGGREGATION; } CMelodyFormulationTrack *pDM; try { pDM = new CMelodyFormulationTrack; } catch( ... ) { return E_OUTOFMEMORY; } if (pDM == NULL) { return E_OUTOFMEMORY; } hr = pDM->QueryInterface(iid, ppv); pDM->Release(); return hr; } ////////////////////////////////////////////////////////////////////// // CDirectMusicMelodyFormulationTrackFactory::LockServer HRESULT __stdcall CDirectMusicMelodyFormulationTrackFactory::LockServer(BOOL bLock) { if (bLock) { InterlockedIncrement(&g_cLock); } else { InterlockedDecrement(&g_cLock); } return S_OK; } ////////////////////////////////////////////////////////////////////// // Standard calls needed to be an inproc server ////////////////////////////////////////////////////////////////////// // DllCanUnloadNow STDAPI DllCanUnloadNow() { if (g_cComponent || g_cLock) { return S_FALSE; } return S_OK; } ////////////////////////////////////////////////////////////////////// // DllGetClassObject STDAPI DllGetClassObject(const CLSID& clsid, const IID& iid, void** ppv) { IUnknown* pIUnknown = NULL; if(clsid == CLSID_DirectMusicStyle) { pIUnknown = static_cast (new CDirectMusicStyleFactory); if(!pIUnknown) { return E_OUTOFMEMORY; } } else if(clsid == CLSID_DMSection) { pIUnknown = static_cast (new CDirectMusicSectionFactory); if(!pIUnknown) { return E_OUTOFMEMORY; } } else if(clsid == CLSID_DirectMusicChordTrack) { pIUnknown = static_cast (new CDirectMusicChordTrackFactory); if(!pIUnknown) { return E_OUTOFMEMORY; } } else if(clsid == CLSID_DirectMusicCommandTrack) { pIUnknown = static_cast (new CDirectMusicCommandTrackFactory); if(!pIUnknown) { return E_OUTOFMEMORY; } } else if(clsid == CLSID_DirectMusicStyleTrack) { pIUnknown = static_cast (new CDirectMusicStyleTrackFactory); if(!pIUnknown) { return E_OUTOFMEMORY; } } else if(clsid == CLSID_DirectMusicMotifTrack) { pIUnknown = static_cast (new CDirectMusicMotifTrackFactory); if(!pIUnknown) { return E_OUTOFMEMORY; } } else if(clsid == CLSID_DirectMusicMuteTrack) { pIUnknown = static_cast (new CDirectMusicMuteTrackFactory); if(!pIUnknown) { return E_OUTOFMEMORY; } } else if(clsid == CLSID_DirectMusicAuditionTrack) { pIUnknown = static_cast (new CDirectMusicAuditionTrackFactory); if(!pIUnknown) { return E_OUTOFMEMORY; } } else if(clsid == CLSID_DirectMusicMelodyFormulationTrack) { pIUnknown = static_cast (new CDirectMusicMelodyFormulationTrackFactory); if(!pIUnknown) { return E_OUTOFMEMORY; } } else { return CLASS_E_CLASSNOTAVAILABLE; } HRESULT hr = pIUnknown->QueryInterface(iid, ppv); pIUnknown->Release(); return hr; } ////////////////////////////////////////////////////////////////////// // DllUnregisterServer STDAPI DllUnregisterServer() { UnregisterServer(CLSID_DirectMusicStyle, g_szStyleFriendlyName, g_szStyleVerIndProgID, g_szStyleProgID); UnregisterServer(CLSID_DMSection, g_szSectionFriendlyName, g_szSectionVerIndProgID, g_szSectionProgID); UnregisterServer(CLSID_DirectMusicChordTrack, g_szChordTrackFriendlyName, g_szChordTrackVerIndProgID, g_szChordTrackProgID); UnregisterServer(CLSID_DirectMusicCommandTrack, g_szCommandTrackFriendlyName, g_szCommandTrackVerIndProgID, g_szCommandTrackProgID); UnregisterServer(CLSID_DirectMusicStyleTrack, g_szStyleTrackFriendlyName, g_szStyleTrackVerIndProgID, g_szStyleTrackProgID); UnregisterServer(CLSID_DirectMusicMotifTrack, g_szMotifTrackFriendlyName, g_szMotifTrackVerIndProgID, g_szMotifTrackProgID); UnregisterServer(CLSID_DirectMusicMuteTrack, g_szMuteTrackFriendlyName, g_szMuteTrackVerIndProgID, g_szMuteTrackProgID); UnregisterServer(CLSID_DirectMusicAuditionTrack, g_szAuditionTrackFriendlyName, g_szAuditionTrackVerIndProgID, g_szAuditionTrackProgID); UnregisterServer(CLSID_DirectMusicMelodyFormulationTrack, g_szMelGenTrackFriendlyName, g_szMelGenTrackVerIndProgID, g_szMelGenTrackProgID); return S_OK; } ////////////////////////////////////////////////////////////////////// // DllRegisterServer STDAPI DllRegisterServer() { RegisterServer(g_hModule, CLSID_DirectMusicStyle, g_szStyleFriendlyName, g_szStyleVerIndProgID, g_szStyleProgID); RegisterServer(g_hModule, CLSID_DMSection, g_szSectionFriendlyName, g_szSectionVerIndProgID, g_szSectionProgID); RegisterServer(g_hModule, CLSID_DirectMusicChordTrack, g_szChordTrackFriendlyName, g_szChordTrackVerIndProgID, g_szChordTrackProgID); RegisterServer(g_hModule, CLSID_DirectMusicCommandTrack, g_szCommandTrackFriendlyName, g_szCommandTrackVerIndProgID, g_szCommandTrackProgID); RegisterServer(g_hModule, CLSID_DirectMusicStyleTrack, g_szStyleTrackFriendlyName, g_szStyleTrackVerIndProgID, g_szStyleTrackProgID); RegisterServer(g_hModule, CLSID_DirectMusicMotifTrack, g_szMotifTrackFriendlyName, g_szMotifTrackVerIndProgID, g_szMotifTrackProgID); RegisterServer(g_hModule, CLSID_DirectMusicMuteTrack, g_szMuteTrackFriendlyName, g_szMuteTrackVerIndProgID, g_szMuteTrackProgID); RegisterServer(g_hModule, CLSID_DirectMusicAuditionTrack, g_szAuditionTrackFriendlyName, g_szAuditionTrackVerIndProgID, g_szAuditionTrackProgID); RegisterServer(g_hModule, CLSID_DirectMusicMelodyFormulationTrack, g_szMelGenTrackFriendlyName, g_szMelGenTrackVerIndProgID, g_szMelGenTrackProgID); return S_OK; } ////////////////////////////////////////////////////////////////////// // Standard Win32 DllMain ////////////////////////////////////////////////////////////////////// // DllMain #ifdef DBG static char* aszReasons[] = { "DLL_PROCESS_DETACH", "DLL_PROCESS_ATTACH", "DLL_THREAD_ATTACH", "DLL_THREAD_DETACH" }; const DWORD nReasons = (sizeof(aszReasons) / sizeof(char*)); #endif BOOL APIENTRY DllMain(HINSTANCE hModule, DWORD dwReason, void *lpReserved) { static int nReferenceCount = 0; #ifdef DBG if (dwReason < nReasons) { TraceI(0, "DllMain: %s\n", (LPSTR)aszReasons[dwReason]); } else { TraceI(0, "DllMain: Unknown dwReason <%u>\n", dwReason); } #endif switch(dwReason) { case DLL_PROCESS_ATTACH: if (++nReferenceCount == 1) { #ifdef DBG DebugInit(); #endif if (!DisableThreadLibraryCalls(hModule)) { TraceI(0, "DisableThreadLibraryCalls failed.\n"); } g_hModule = hModule; } break; #ifdef DBG case DLL_PROCESS_DETACH: if (--nReferenceCount == 0) { TraceI(-1, "Unloading g_cLock %d g_cComponent %d\n", g_cLock, g_cComponent); // Assert if we still have some objects hanging around assert(g_cComponent == 0); assert(g_cLock == 0); } break; #endif } return TRUE; }