You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
537 lines
16 KiB
537 lines
16 KiB
// 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 <objbase.h>
|
|
#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 <regstr.h>
|
|
#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<IClassFactory*>(this);
|
|
} else {
|
|
*ppv = NULL;
|
|
return E_NOINTERFACE;
|
|
}
|
|
|
|
reinterpret_cast<IUnknown*>(*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<IUnknown*> (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;
|
|
}
|