// 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(&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(&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); } }