// Copyright (c) 1999 Microsoft Corporation. All rights reserved. // // Functions that implement the automation interfaces for the DirectMusic constants. // #include "stdinc.h" #include "autconstants.h" #include "oleaut.h" struct AutConstantDef { DISPID dispid; const WCHAR *pwszName; LONG lVal; }; // Performance const DISPID DMCONSTDISP_IsSecondary = 1; const DISPID DMCONSTDISP_IsControl = 2; const DISPID DMCONSTDISP_AtFinish = 3; const DISPID DMCONSTDISP_AtGrid = 4; const DISPID DMCONSTDISP_AtBeat = 5; const DISPID DMCONSTDISP_AtMeasure = 6; const DISPID DMCONSTDISP_AtMarker = 7; const DISPID DMCONSTDISP_AtImmediate = 8; const DISPID DMCONSTDISP_AlignToBar = 9; const DISPID DMCONSTDISP_AlignToBeat = 10; const DISPID DMCONSTDISP_AlignToSegment = 11; const DISPID DMCONSTDISP_PlayFill = 12; const DISPID DMCONSTDISP_PlayIntro = 13; const DISPID DMCONSTDISP_PlayBreak = 14; const DISPID DMCONSTDISP_PlayEnd = 15; const DISPID DMCONSTDISP_PlayEndAndIntro = 16; const DISPID DMCONSTDISP_PlayModulate = 17; const DISPID DMCONSTDISP_UseClockTime = 18; const DISPID DMCONSTDISP_NoCutoff = 19; const AutConstantDef gs_Constants[] = { { DMCONSTDISP_IsSecondary, L"IsSecondary", ScriptConstants::IsSecondary }, { DMCONSTDISP_IsControl, L"IsControl", ScriptConstants::IsControl }, { DMCONSTDISP_AtFinish, L"AtFinish", ScriptConstants::AtFinish }, { DMCONSTDISP_AtGrid, L"AtGrid", ScriptConstants::AtGrid }, { DMCONSTDISP_AtBeat, L"AtBeat", ScriptConstants::AtBeat }, { DMCONSTDISP_AtMeasure, L"AtMeasure", ScriptConstants::AtMeasure }, { DMCONSTDISP_AtMarker, L"AtMarker", ScriptConstants::AtMarker }, { DMCONSTDISP_AtImmediate, L"AtImmediate", ScriptConstants::AtImmediate }, { DMCONSTDISP_AlignToBar, L"AlignToBar", ScriptConstants::AlignToBar }, { DMCONSTDISP_AlignToBeat, L"AlignToBeat", ScriptConstants::AlignToBeat }, { DMCONSTDISP_AlignToSegment, L"AlignToSegment", ScriptConstants::AlignToSegment }, { DMCONSTDISP_PlayFill, L"PlayFill", ScriptConstants::PlayFill }, { DMCONSTDISP_PlayIntro, L"PlayIntro", ScriptConstants::PlayIntro }, { DMCONSTDISP_PlayBreak, L"PlayBreak", ScriptConstants::PlayBreak }, { DMCONSTDISP_PlayEnd, L"PlayEnd", ScriptConstants::PlayEnd }, { DMCONSTDISP_PlayEndAndIntro, L"PlayEndAndIntro", ScriptConstants::PlayEndAndIntro }, { DMCONSTDISP_PlayModulate, L"PlayModulate", ScriptConstants::PlayModulate }, { DMCONSTDISP_NoCutoff, L"NoCutoff", ScriptConstants::NoCutoff }, { DISPID_UNKNOWN } }; HRESULT AutConstantsGetIDsOfNames( REFIID riid, LPOLESTR __RPC_FAR *rgszNames, UINT cNames, LCID lcid, DISPID __RPC_FAR *rgDispId) { V_INAME(AutConstantsGetIDsOfNames); V_BUFPTR_READ(rgszNames, sizeof(LPOLESTR) * cNames); V_BUFPTR_WRITE(rgDispId, sizeof(DISPID) * cNames); if (riid != IID_NULL) return DISP_E_UNKNOWNINTERFACE; if (cNames == 0) return S_OK; // Clear out dispid's for (UINT c = 0; c < cNames; ++c) { rgDispId[c] = DISPID_UNKNOWN; } // See if we have a method with the first name for (c = 0; gs_Constants[c].dispid != DISPID_UNKNOWN; ++c) { if (0 == _wcsicmp(rgszNames[0], gs_Constants[c].pwszName)) { rgDispId[0] = gs_Constants[c].dispid; break; } } // Additional names requested (cNames > 1) are named parameters, // which isn't something we support. // Return DISP_E_UNKNOWNNAME in this case, and in the case that we didn't match // the first name. if (rgDispId[0] == DISPID_UNKNOWN || cNames > 1) return DISP_E_UNKNOWNNAME; return S_OK; } HRESULT AutConstantsInvoke( DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS __RPC_FAR *pDispParams, VARIANT __RPC_FAR *pVarResult, EXCEPINFO __RPC_FAR *pExcepInfo, UINT __RPC_FAR *puArgErr) { V_INAME(AutConstantsInvoke); V_PTR_READ(pDispParams, DISPPARAMS); V_PTR_WRITE_OPT(pVarResult, VARIANT); V_PTR_WRITE_OPT(pExcepInfo, EXCEPINFO); bool fUseOleAut = !!(riid == IID_NULL); // Additional parameter validation if (!fUseOleAut && riid != g_guidInvokeWithoutOleaut) return DISP_E_UNKNOWNINTERFACE; if (!(wFlags & DISPATCH_PROPERTYGET)) return DISP_E_MEMBERNOTFOUND; if (pDispParams->cArgs > 0) return DISP_E_BADPARAMCOUNT; if (pDispParams->cNamedArgs > 0) return DISP_E_NONAMEDARGS; // Zero the out params if (puArgErr) *puArgErr = 0; if (pVarResult) { DMS_VariantInit(fUseOleAut, pVarResult); } // Find the constant for (const AutConstantDef *pConst = gs_Constants; pConst->dispid != DISPID_UNKNOWN && pConst->dispid != dispIdMember; ++pConst) { } if (pConst->dispid == DISPID_UNKNOWN) return DISP_E_MEMBERNOTFOUND; // Return the value value if (pVarResult) { pVarResult->vt = VT_I4; pVarResult->lVal = pConst->lVal; } return S_OK; }