79 lines
3.7 KiB
C++
79 lines
3.7 KiB
C++
// Copyright (c) 1999 Microsoft Corporation. All rights reserved.
|
|
//
|
|
// Declaration of CSingleThreadedScriptManager.
|
|
// Wraps CActiveScriptManager to accept calls from multiple scripts and behind the
|
|
// scenes farms them out to a single worker thread that actually talks to the script engine.
|
|
//
|
|
// The virtual base class ScriptManager can be used to talk to either
|
|
// CActiveScriptManager or CSingleThreadedActiveScriptManager.
|
|
//
|
|
|
|
#pragma once
|
|
|
|
#include "workthread.h"
|
|
|
|
// forward declaration
|
|
class CDirectMusicScript;
|
|
|
|
class ScriptManager
|
|
{
|
|
public:
|
|
virtual HRESULT Start(DMUS_SCRIPT_ERRORINFO *pErrorInfo) = 0;
|
|
virtual HRESULT CallRoutine(const WCHAR *pwszRoutineName, DMUS_SCRIPT_ERRORINFO *pErrorInfo) = 0;
|
|
virtual HRESULT ScriptTrackCallRoutine(
|
|
const WCHAR *pwszRoutineName,
|
|
IDirectMusicSegmentState *pSegSt,
|
|
DWORD dwVirtualTrackID,
|
|
bool fErrorPMsgsEnabled,
|
|
__int64 i64IntendedStartTime,
|
|
DWORD dwIntendedStartTimeFlags) = 0;
|
|
virtual HRESULT SetVariable(const WCHAR *pwszVariableName, VARIANT varValue, bool fSetRef, DMUS_SCRIPT_ERRORINFO *pErrorInfo) = 0;
|
|
virtual HRESULT GetVariable(const WCHAR *pwszVariableName, VARIANT *pvarValue, DMUS_SCRIPT_ERRORINFO *pErrorInfo) = 0;
|
|
virtual HRESULT EnumItem(bool fRoutine, DWORD dwIndex, WCHAR *pwszName, int *pcItems) = 0; // fRoutine true to get a routine, false to get a variable. pcItems (if supplied) is set to the total number of items
|
|
virtual HRESULT DispGetIDsOfNames(REFIID riid, LPOLESTR __RPC_FAR *rgszNames, UINT cNames, LCID lcid, DISPID __RPC_FAR *rgDispId) = 0;
|
|
virtual HRESULT DispInvoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS __RPC_FAR *pDispParams, VARIANT __RPC_FAR *pVarResult, EXCEPINFO __RPC_FAR *pExcepInfo, UINT __RPC_FAR *puArgErr) = 0;
|
|
virtual void Close() = 0;
|
|
STDMETHOD_(ULONG, Release)() = 0;
|
|
};
|
|
|
|
// VBScript (and likely any other scripting languages besides our custom engine) fails if called from different threads.
|
|
// This class wraps such an engine, providing a ScriptManager interface that can be called from multiple threads but marshals
|
|
// all the calls to the engine onto a single worker thread.
|
|
class CSingleThreadedScriptManager : public ScriptManager
|
|
{
|
|
public:
|
|
// The worker thread needs to be cleaned up using the static member function before the .dll is unloaded.
|
|
static void TerminateThread() { ms_Thread.Terminate(true); }
|
|
|
|
CSingleThreadedScriptManager(
|
|
bool fUseOleAut,
|
|
const WCHAR *pwszLanguage,
|
|
const WCHAR *pwszSource,
|
|
CDirectMusicScript *pParentScript,
|
|
HRESULT *phr,
|
|
DMUS_SCRIPT_ERRORINFO *pErrorInfo);
|
|
|
|
HRESULT Start(DMUS_SCRIPT_ERRORINFO *pErrorInfo);
|
|
HRESULT CallRoutine(const WCHAR *pwszRoutineName, DMUS_SCRIPT_ERRORINFO *pErrorInfo);
|
|
HRESULT ScriptTrackCallRoutine(
|
|
const WCHAR *pwszRoutineName,
|
|
IDirectMusicSegmentState *pSegSt,
|
|
DWORD dwVirtualTrackID,
|
|
bool fErrorPMsgsEnabled,
|
|
__int64 i64IntendedStartTime,
|
|
DWORD dwIntendedStartTimeFlags);
|
|
HRESULT SetVariable(const WCHAR *pwszVariableName, VARIANT varValue, bool fSetRef, DMUS_SCRIPT_ERRORINFO *pErrorInfo);
|
|
HRESULT GetVariable(const WCHAR *pwszVariableName, VARIANT *pvarValue, DMUS_SCRIPT_ERRORINFO *pErrorInfo);
|
|
HRESULT EnumItem(bool fRoutine, DWORD dwIndex, WCHAR *pwszName, int *pcItems);
|
|
HRESULT DispGetIDsOfNames(REFIID riid, LPOLESTR __RPC_FAR *rgszNames, UINT cNames, LCID lcid, DISPID __RPC_FAR *rgDispId);
|
|
HRESULT DispInvoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS __RPC_FAR *pDispParams, VARIANT __RPC_FAR *pVarResult, EXCEPINFO __RPC_FAR *pExcepInfo, UINT __RPC_FAR *puArgErr);
|
|
void Close();
|
|
STDMETHOD_(ULONG, Release)();
|
|
|
|
private:
|
|
friend void F_Create(void *pvParams);
|
|
|
|
static CWorkerThread ms_Thread;
|
|
ScriptManager *m_pScriptManager;
|
|
};
|