// Copyright (c) 1998-1999 Microsoft Corporation // loader dll.cpp // // Dll entry points and CToolFactory, CContainerFactory implementation // // 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 "oledll.h" #include "debug.h" #include "dmusicc.h" #include "dmusici.h" #include "BaseTool.h" #include "Echo.h" #include "Transpose.h" #include "Duration.h" #include "Quantize.h" #include "TimeShift.h" #include "Swing.h" #include "Velocity.h" #ifndef UNDER_CE #include #endif // Globals // // Version information for our class // TCHAR g_szEchoFriendlyName[] = TEXT("Microsoft Echo Tool"); TCHAR g_szEchoShortName[] = TEXT("Echo"); TCHAR g_szEchoDescription[] = TEXT("Echoes notes"); TCHAR g_szEchoVerIndProgID[] = TEXT("Microsoft.DirectMusicEchoTool"); TCHAR g_szEchoProgID[] = TEXT("Microsoft.DirectMusicEchoTool.1"); TCHAR g_szTransposeFriendlyName[] = TEXT("Microsoft Transpose Tool"); TCHAR g_szTransposeShortName[] = TEXT("Transpose"); TCHAR g_szTransposeDescription[] = TEXT("Transposes notes"); TCHAR g_szTransposeVerIndProgID[] = TEXT("Microsoft.DirectMusicTransposeTool"); TCHAR g_szTransposeProgID[] = TEXT("Microsoft.DirectMusicTransposeTool.1"); TCHAR g_szDurationFriendlyName[] = TEXT("Microsoft Duration Modifier Tool"); TCHAR g_szDurationShortName[] = TEXT("Duration"); TCHAR g_szDurationDescription[] = TEXT("Scales note durations"); TCHAR g_szDurationVerIndProgID[] = TEXT("Microsoft.DirectMusicDurationTool"); TCHAR g_szDurationProgID[] = TEXT("Microsoft.DirectMusicDurationTool.1"); TCHAR g_szQuantizeFriendlyName[] = TEXT("Microsoft Quantize Tool"); TCHAR g_szQuantizeShortName[] = TEXT("Quantize"); TCHAR g_szQuantizeDescription[] = TEXT("Quantizes note starts and durations"); TCHAR g_szQuantizeVerIndProgID[] = TEXT("Microsoft.DirectMusicQuantizeTool"); TCHAR g_szQuantizeProgID[] = TEXT("Microsoft.DirectMusicQuantizeTool.1"); TCHAR g_szTimeShiftFriendlyName[] = TEXT("Microsoft Time Shift Tool"); TCHAR g_szTimeShiftShortName[] = TEXT("Time Shift"); TCHAR g_szTimeShiftDescription[] = TEXT("Shifts and randomizes note starts"); TCHAR g_szTimeShiftVerIndProgID[] = TEXT("Microsoft.DirectMusicTimeShiftTool"); TCHAR g_szTimeShiftProgID[] = TEXT("Microsoft.DirectMusicTimeShiftTool.1"); TCHAR g_szSwingFriendlyName[] = TEXT("Microsoft Swing Tool"); TCHAR g_szSwingShortName[] = TEXT("Swing"); TCHAR g_szSwingDescription[] = TEXT("Changes the timing to a adopt a triplet rhythm"); TCHAR g_szSwingVerIndProgID[] = TEXT("Microsoft.DirectMusicSwingTool"); TCHAR g_szSwingProgID[] = TEXT("Microsoft.DirectMusicSwingTool.1"); TCHAR g_szVelocityFriendlyName[] = TEXT("Microsoft Velocity Transform Tool"); TCHAR g_szVelocityShortName[] = TEXT("Velocity Transform"); TCHAR g_szVelocityDescription[] = TEXT("Modifies note velocities"); TCHAR g_szVelocityVerIndProgID[] = TEXT("Microsoft.DirectMusicVelocityTool"); TCHAR g_szVelocityProgID[] = TEXT("Microsoft.DirectMusicVelocityTool.1"); // Dll's hModule // HMODULE g_hModule = NULL; #ifndef UNDER_CE // Track whether running on Unicode machine. BOOL g_fIsUnicode = FALSE; #endif // Count of active components and class factory server locks // long g_cComponent = 0; long g_cLock = 0; // CToolFactory::QueryInterface // HRESULT __stdcall CToolFactory::QueryInterface(const IID &iid, void **ppv) { if (iid == IID_IUnknown || iid == IID_IClassFactory) { *ppv = static_cast(this); } else { *ppv = NULL; return E_NOINTERFACE; } reinterpret_cast(*ppv)->AddRef(); return S_OK; } CToolFactory::CToolFactory(DWORD dwToolType) { m_cRef = 1; m_dwToolType = dwToolType; InterlockedIncrement(&g_cLock); } CToolFactory::~CToolFactory() { InterlockedDecrement(&g_cLock); } // CToolFactory::AddRef // ULONG __stdcall CToolFactory::AddRef() { return InterlockedIncrement(&m_cRef); } // CToolFactory::Release // ULONG __stdcall CToolFactory::Release() { if (!InterlockedDecrement(&m_cRef)) { delete this; return 0; } return m_cRef; } // CToolFactory::CreateInstance // // HRESULT __stdcall CToolFactory::CreateInstance(IUnknown* pUnknownOuter, const IID& iid, void** ppv) { HRESULT hr; if (pUnknownOuter) { return CLASS_E_NOAGGREGATION; } CBaseTool *pTool; switch (m_dwToolType) { case TOOL_ECHO: pTool = new CEchoTool; break; case TOOL_TRANSPOSE: pTool = new CTransposeTool; break; case TOOL_SWING: pTool = new CSwingTool; break; case TOOL_DURATION: pTool = new CDurationTool; break; case TOOL_QUANTIZE: pTool = new CQuantizeTool; break; case TOOL_TIMESHIFT: pTool = new CTimeShiftTool; break; case TOOL_VELOCITY: pTool = new CVelocityTool; break; } if (pTool == NULL) { return E_OUTOFMEMORY; } hr = pTool->QueryInterface(iid, ppv); pTool->Release(); return hr; } // CToolFactory::LockServer // HRESULT __stdcall CToolFactory::LockServer(BOOL bLock) { if (bLock) { InterlockedIncrement(&g_cLock); } else { InterlockedDecrement(&g_cLock); } return S_OK; } // Standard calls needed to be an inproc server // STDAPI DllCanUnloadNow() { if (g_cComponent || g_cLock) { return S_FALSE; } return S_OK; } STDAPI DllGetClassObject(const CLSID& clsid, const IID& iid, void** ppv) { IUnknown* pIUnknown = NULL; DWORD dwTypeID = 0; if(clsid == CLSID_DirectMusicEchoTool) { dwTypeID = TOOL_ECHO; } else if(clsid == CLSID_DirectMusicTransposeTool) { dwTypeID = TOOL_TRANSPOSE; } else if(clsid == CLSID_DirectMusicDurationTool) { dwTypeID = TOOL_DURATION; } else if(clsid == CLSID_DirectMusicQuantizeTool) { dwTypeID = TOOL_QUANTIZE; } else if(clsid == CLSID_DirectMusicTimeShiftTool) { dwTypeID = TOOL_TIMESHIFT; } else if(clsid == CLSID_DirectMusicSwingTool) { dwTypeID = TOOL_SWING; } else if(clsid == CLSID_DirectMusicVelocityTool) { dwTypeID = TOOL_VELOCITY; } else { return CLASS_E_CLASSNOTAVAILABLE; } pIUnknown = static_cast (new CToolFactory(dwTypeID)); if(pIUnknown) { HRESULT hr = pIUnknown->QueryInterface(iid, ppv); pIUnknown->Release(); return hr; } return E_OUTOFMEMORY; } const TCHAR cszToolRegRoot[] = TEXT(DMUS_REGSTR_PATH_TOOLS) TEXT("\\"); const TCHAR cszDescriptionKey[] = TEXT("Description"); const TCHAR cszNameKey[] = TEXT("Name"); const TCHAR cszShortNameKey[] = TEXT("ShortName"); const int CLSID_STRING_SIZE = 39; HRESULT CLSIDToStr(const CLSID &clsid, TCHAR *szStr, int cbStr); HRESULT RegisterTool(REFGUID guid, const TCHAR szDescription[], const TCHAR szShortName[], const TCHAR szName[]) { HKEY hk; TCHAR szCLSID[CLSID_STRING_SIZE]; TCHAR szRegKey[256]; HRESULT hr = CLSIDToStr(guid, szCLSID, sizeof(szCLSID)); if (!SUCCEEDED(hr)) { return hr; } lstrcpy(szRegKey, cszToolRegRoot); lstrcat(szRegKey, szCLSID); if (RegCreateKey(HKEY_LOCAL_MACHINE, szRegKey, &hk)) { return E_FAIL; } hr = S_OK; if (RegSetValueEx(hk, cszDescriptionKey, 0L, REG_SZ, (CONST BYTE*)szDescription, lstrlen(szDescription) + 1)) { hr = E_FAIL; } if (RegSetValueEx(hk, cszNameKey, 0L, REG_SZ, (CONST BYTE*)szName, lstrlen(szName) + 1)) { hr = E_FAIL; } if (RegSetValueEx(hk, cszShortNameKey, 0L, REG_SZ, (CONST BYTE*)szShortName, lstrlen(szName) + 1)) { hr = E_FAIL; } RegCloseKey(hk); return hr; } HRESULT UnregisterTool(REFGUID guid) { HKEY hk; TCHAR szCLSID[CLSID_STRING_SIZE]; TCHAR szRegKey[256]; HRESULT hr = CLSIDToStr(guid, szCLSID, sizeof(szCLSID)); if (!SUCCEEDED(hr)) { return hr; } lstrcpy(szRegKey, cszToolRegRoot); lstrcat(szRegKey, szCLSID); if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,szRegKey,0,KEY_ALL_ACCESS | KEY_WRITE, &hk)) { return E_FAIL; } hr = S_OK; if (RegDeleteValue(hk,cszDescriptionKey)) { hr = E_FAIL; } if (RegDeleteValue(hk,cszNameKey)) { hr = E_FAIL; } if (RegDeleteValue(hk,cszShortNameKey)) { hr = E_FAIL; } RegCloseKey(hk); if (RegDeleteKey(HKEY_LOCAL_MACHINE,szRegKey)) { hr = E_FAIL; } return hr; } STDAPI DllUnregisterServer() { UnregisterServer(CLSID_DirectMusicEchoTool, g_szEchoFriendlyName, g_szEchoVerIndProgID, g_szEchoProgID); UnregisterTool(CLSID_DirectMusicEchoTool); UnregisterServer(CLSID_DirectMusicTransposeTool, g_szTransposeFriendlyName, g_szTransposeVerIndProgID, g_szTransposeProgID); UnregisterTool(CLSID_DirectMusicTransposeTool); UnregisterServer(CLSID_DirectMusicDurationTool, g_szDurationFriendlyName, g_szDurationVerIndProgID, g_szDurationProgID); UnregisterTool(CLSID_DirectMusicDurationTool); UnregisterServer(CLSID_DirectMusicQuantizeTool, g_szQuantizeFriendlyName, g_szQuantizeVerIndProgID, g_szQuantizeProgID); UnregisterTool(CLSID_DirectMusicQuantizeTool); UnregisterServer(CLSID_DirectMusicSwingTool, g_szSwingFriendlyName, g_szSwingVerIndProgID, g_szSwingProgID); UnregisterTool(CLSID_DirectMusicSwingTool); UnregisterServer(CLSID_DirectMusicTimeShiftTool, g_szTimeShiftFriendlyName, g_szTimeShiftVerIndProgID, g_szTimeShiftProgID); UnregisterTool(CLSID_DirectMusicTimeShiftTool); UnregisterServer(CLSID_DirectMusicVelocityTool, g_szVelocityFriendlyName, g_szVelocityVerIndProgID, g_szVelocityProgID); UnregisterTool(CLSID_DirectMusicVelocityTool); return S_OK; } STDAPI DllRegisterServer() { RegisterServer(g_hModule, CLSID_DirectMusicEchoTool, g_szEchoFriendlyName, g_szEchoVerIndProgID, g_szEchoProgID); RegisterTool(CLSID_DirectMusicEchoTool, g_szEchoDescription, g_szEchoShortName, g_szEchoFriendlyName); RegisterServer(g_hModule, CLSID_DirectMusicTransposeTool, g_szTransposeFriendlyName, g_szTransposeVerIndProgID, g_szTransposeProgID); RegisterTool(CLSID_DirectMusicTransposeTool, g_szTransposeDescription, g_szTransposeShortName, g_szTransposeFriendlyName); RegisterServer(g_hModule, CLSID_DirectMusicDurationTool, g_szDurationFriendlyName, g_szDurationVerIndProgID, g_szDurationProgID); RegisterTool(CLSID_DirectMusicDurationTool, g_szDurationDescription, g_szDurationShortName, g_szDurationFriendlyName); RegisterServer(g_hModule, CLSID_DirectMusicQuantizeTool, g_szQuantizeFriendlyName, g_szQuantizeVerIndProgID, g_szQuantizeProgID); RegisterTool(CLSID_DirectMusicQuantizeTool, g_szQuantizeDescription, g_szQuantizeShortName, g_szQuantizeFriendlyName); RegisterServer(g_hModule, CLSID_DirectMusicSwingTool, g_szSwingFriendlyName, g_szSwingVerIndProgID, g_szSwingProgID); RegisterTool(CLSID_DirectMusicSwingTool, g_szSwingDescription, g_szSwingShortName, g_szSwingFriendlyName); RegisterServer(g_hModule, CLSID_DirectMusicTimeShiftTool, g_szTimeShiftFriendlyName, g_szTimeShiftVerIndProgID, g_szTimeShiftProgID); RegisterTool(CLSID_DirectMusicTimeShiftTool, g_szTimeShiftDescription, g_szTimeShiftShortName, g_szTimeShiftFriendlyName); RegisterServer(g_hModule, CLSID_DirectMusicVelocityTool, g_szVelocityFriendlyName, g_szVelocityVerIndProgID, g_szVelocityProgID); RegisterTool(CLSID_DirectMusicVelocityTool, g_szVelocityDescription, g_szVelocityShortName, g_szVelocityFriendlyName); return S_OK; } extern void DebugInit(); // Standard Win32 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) { DebugTrace(0, "DllMain: %s\n", (LPSTR)aszReasons[dwReason]); } else { DebugTrace(0, "DllMain: Unknown dwReason <%u>\n", dwReason); } #endif if (dwReason == DLL_PROCESS_ATTACH) { if (++nReferenceCount == 1) { g_hModule = (HMODULE)hModule; #ifndef UNDER_CE OSVERSIONINFO osvi; DisableThreadLibraryCalls(hModule); osvi.dwOSVersionInfoSize = sizeof(osvi); GetVersionEx(&osvi); g_fIsUnicode = (osvi.dwPlatformId != VER_PLATFORM_WIN32_WINDOWS); #endif #ifdef DBG DebugInit(); #endif } } return TRUE; }