windows-nt/Source/XPSP1/NT/multimedia/directx/dmusic/dmscript/enginc.cpp

129 lines
4 KiB
C++
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
// Copyright (c) 1999 Microsoft Corporation. All rights reserved.
//
// Standard included stuff for the AudioVBScript engine.
//
#include "stdinc.h"
#include "enginc.h"
const char *g_rgszBuiltInConstants[] = { "true", "false", "nothing" };
const int g_cBuiltInConstants = ARRAY_SIZE(g_rgszBuiltInConstants);
DISPID
GetDispID(IDispatch *pIDispatch, const char *pszBase)
{
SmartRef::WString wstrBase = pszBase;
if (!wstrBase)
return DISPID_UNKNOWN;
DISPID dispid = DISPID_UNKNOWN;
const WCHAR *wszBase = wstrBase;
pIDispatch->GetIDsOfNames(IID_NULL, const_cast<WCHAR**>(&wszBase), 1, lcidUSEnglish, &dispid);
return dispid;
}
// See oleaut.h for more info about why this is necessary.
HRESULT
InvokeAttemptingNotToUseOleAut(
IDispatch *pDisp,
DISPID dispIdMember,
WORD wFlags,
DISPPARAMS *pDispParams,
VARIANT *pVarResult,
EXCEPINFO *pExcepInfo,
UINT *puArgErr)
{
if (g_fUseOleAut)
{
// Engine is set to always use oleaut32.dll.
return pDisp->Invoke(dispIdMember, IID_NULL, lcidUSEnglish, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
}
// Try not to use oleaut32.dll.
HRESULT hr = pDisp->Invoke(dispIdMember, g_guidInvokeWithoutOleaut, lcidUSEnglish, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
if (hr != DISP_E_UNKNOWNINTERFACE)
return hr;
// It didn't like being called that way. Must be some other scripting language or non-DMusic dispatch interface.
// Use regular oleaut32.dll calling convention.
if (pVarResult)
{
// We need to convert the return into our own kind of variant.
VARIANT var;
DMS_VariantInit(true, &var);
hr = pDisp->Invoke(dispIdMember, IID_NULL, lcidUSEnglish, wFlags, pDispParams, &var, pExcepInfo, puArgErr);
DMS_VariantCopy(false, pVarResult, &var);
DMS_VariantClear(true, &var);
}
else
{
// There's no result so no conversion is necessary.
hr = pDisp->Invoke(dispIdMember, IID_NULL, lcidUSEnglish, wFlags, pDispParams, NULL, pExcepInfo, puArgErr);
}
// If an exception occurred, we need to convert the error strings into our own kind of BSTR.
if (hr == DISP_E_EXCEPTION)
ConvertOleAutExceptionBSTRs(true, false, pExcepInfo);
return hr;
}
HRESULT
SetDispatchProperty(IDispatch *pDisp, DISPID dispid, bool fSetRef, const VARIANT &v, EXCEPINFO *pExcepInfo)
{
DISPID dispidPropPut = DISPID_PROPERTYPUT;
DISPPARAMS dispparams;
dispparams.rgvarg = const_cast<VARIANT*>(&v);
dispparams.rgdispidNamedArgs = &dispidPropPut;
dispparams.cArgs = 1;
dispparams.cNamedArgs = 1;
HRESULT hr = InvokeAttemptingNotToUseOleAut(
pDisp,
dispid,
fSetRef ? DISPATCH_PROPERTYPUTREF : DISPATCH_PROPERTYPUT,
&dispparams,
NULL,
pExcepInfo,
NULL);
return hr;
}
HRESULT
GetDispatchProperty(IDispatch *pDisp, DISPID dispid, VARIANT &v, EXCEPINFO *pExcepInfo)
{
DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0};
HRESULT hr = InvokeAttemptingNotToUseOleAut(
pDisp,
dispid,
DISPATCH_PROPERTYGET | DISPATCH_METHOD,
// DISPATCH_METHOD is also set because in VB syntax a function with no parameters
// can be accessed like a property. Example "x = GetMasterGrooveLevel" is a
// shortcut for "x = GetMasterGrooveLevel()".
&dispparamsNoArgs,
&v,
pExcepInfo,
NULL);
return hr;
}
// If needed, converts the BSTRs in an EXCEPINFO structure between formats using or not using OleAut.
void ConvertOleAutExceptionBSTRs(bool fCurrentlyUsesOleAut, bool fResultUsesOleAut, EXCEPINFO *pExcepInfo)
{
if (pExcepInfo && fCurrentlyUsesOleAut != fResultUsesOleAut)
{
BSTR bstrSource = pExcepInfo->bstrSource;
BSTR bstrDescription = pExcepInfo->bstrDescription;
BSTR bstrHelpFile = pExcepInfo->bstrHelpFile;
pExcepInfo->bstrSource = DMS_SysAllocString(fResultUsesOleAut, bstrSource);
pExcepInfo->bstrDescription = DMS_SysAllocString(fResultUsesOleAut, bstrDescription);
pExcepInfo->bstrHelpFile = DMS_SysAllocString(fResultUsesOleAut, bstrHelpFile);
DMS_SysFreeString(fCurrentlyUsesOleAut, bstrSource);
DMS_SysFreeString(fCurrentlyUsesOleAut, bstrDescription);
DMS_SysFreeString(fCurrentlyUsesOleAut, bstrHelpFile);
}
}