|
|
#ifndef SCRIPT_H
#define SCRIPT_H
/***************************************************************************
Project: VB Script and JavaScript Reviewed: Copyright (c) Microsoft Corporation
This defines the public interface to VB Script and JavaScript.
***************************************************************************/
#include "activscp.h"
typedef void *HSCRIPT; // Handle to a scripting environment instance
typedef void *HENTRY; // Handle to a script entry point
typedef unsigned long MODID; const MODID kmodGlobal = 0;
// PFNOUTPUT is used for all output for the script, including compile errors,
// printing (if ScriptAdmin is called to turn on printing), dumping pcode
// (if requested when ScriptAddScript is called), etc.
typedef void (_stdcall *PFNOUTPUT)(DWORD, LPCOLESTR, BOOL);
enum SAdminEnum { scadEnableCreateObject = 1, // Only used in VER1
scadEnablePrint, scadEnableTakeOutTrash, // Only used in JavaScript
};
STDAPI ScriptBreakThread(DWORD dwThreadID);
inline void FreeExcepInfo(EXCEPINFO *pei) { if (pei->bstrSource) SysFreeString(pei->bstrSource); if (pei->bstrDescription) SysFreeString(pei->bstrDescription); if (pei->bstrHelpFile) SysFreeString(pei->bstrHelpFile); memset(pei, 0, sizeof(*pei)); }
struct ScriptException { IUnknown *punk; BSTR bstrUser; // user data as provided to AddToScript - binary data
long ichMin; // character range of error
long ichLim; long line; // line number of error (zero based)
long ichMinLine; // starting char of the line
BSTR bstrLine; // source line (if available)
BOOL fReported; // been reported via IScriptSite->OnScriptError?
// must be last
EXCEPINFO ei;
void Clear(void) { memset(this, 0, sizeof(*this)); }
void Free(void) { FreeExcepInfo(&ei); if (NULL != punk) punk->Release(); if (NULL != bstrUser) SysFreeString(bstrUser); if (NULL != bstrLine) SysFreeString(bstrLine); memset(this, 0, offsetof(ScriptException, ei)); } };
/***************************************************************************
The COM Interfaces ***************************************************************************/
enum { fdexNil = 0x00, fdexDontCreate = 0x01, fdexInitNull = 0x02, fdexCaseSensitive = 0x04, fdexLim = 0x80, }; const DWORD kgrfdexAll = fdexLim - 1;
// This is the interface for extensible IDispatch objects.
class IDispatchEx : public IDispatch { public: // Get dispID for names, with options
virtual HRESULT STDMETHODCALLTYPE GetIDsOfNamesEx(REFIID riid, LPOLESTR *prgpsz, UINT cpsz, LCID lcid, DISPID *prgid, DWORD grfdex) = 0;
// Enumerate dispIDs and their associated "names".
// Returns S_FALSE if the enumeration is done, S_OK if it's not, an
// error code if the call fails.
virtual HRESULT STDMETHODCALLTYPE GetNextDispID(DISPID id, DISPID *pid, BSTR *pbstrName) = 0; };
// Interface on owner of an IScript object. To avoid circular refcounts,
// the IScript implementation should not AddRef this interface.
class IScriptSite : public IUnknown { public: // IScriptSite Methods
// NOTE: OnEnterScript() and OnLeaveScript() will nest, but must be
// balanced pairs.
// OnEnterScript() is called before entering the execution loop.
virtual void STDMETHODCALLTYPE OnEnterScript(void) = 0; // OnLeaveScript() is called upon exiting the execution loop.
virtual void STDMETHODCALLTYPE OnLeaveScript(void) = 0;
virtual HRESULT STDMETHODCALLTYPE GetActiveScriptSiteWindow( IActiveScriptSiteWindow **ppassw) = 0;
// error feedback - the client should not muck with the sei. We own it.
virtual HRESULT STDMETHODCALLTYPE OnScriptError(const ScriptException *psei) = 0;
// LCID support
virtual LCID STDMETHODCALLTYPE GetUserLcid(void) = 0;
// call back to get an object for a name
virtual HRESULT STDMETHODCALLTYPE GetExternObject(long lwCookie, IDispatch ** ppdisp) = 0;
#if SCRIPT_DEBUGGER
virtual HRESULT STDMETHODCALLTYPE DebugBreakPoint(IUnknown *punk, void *pvUser, long cbUser, long ichMin, long ichLim) = 0; #endif //SCRIPT_DEBUGGER
#if VER2
virtual DWORD STDMETHODCALLTYPE GetSafetyOptions(void) = 0; #endif //VER2
virtual HRESULT STDMETHODCALLTYPE GetInterruptInfo(EXCEPINFO * pexcepinfo) = 0;
};
enum { fscrNil = 0x00, fscrDumpPcode = 0x01, // dump pcode to the output function
fscrPersist = 0x08, // keep this code on reset
fscrParseHTMLComments = 0x10, fscrReturnExpression = 0x20,// call should return the last expression
fscrImpliedThis = 0x40, // 'this.' is optional (for Call)
fscrDebug = 0x80, // keep this code around for debugging
};
#if SCRIPT_DEBUGGER
enum BP_COMMAND { BPCMD_GET, BPCMD_SET, BPCMD_CLEAR, BPCMD_TOGGLE }; #endif //SCRIPT_DEBUGGER
class IScript : public IUnknown { public: // IScript methods
virtual HRESULT STDMETHODCALLTYPE AddToScript(LPCOLESTR pszSrc, MODID mod, IUnknown *punk, void *pvData, long cbData, ULONG grfscr, HENTRY *phentryGlobal, ScriptException *pse) = 0; virtual HRESULT STDMETHODCALLTYPE AddObject(LPCOLESTR pszName, IDispatch *pdisp, MODID mod = kmodGlobal, long lwCookie = 0) = 0; virtual HRESULT STDMETHODCALLTYPE AddObjectMember(LPCOLESTR pszName, IDispatch *pdisp, DISPID dispID, MODID mod = kmodGlobal) = 0; virtual HRESULT STDMETHODCALLTYPE GetEntryPoint(LPCOLESTR pszName, HENTRY *phentry, MODID mod = kmodGlobal) = 0; virtual HRESULT STDMETHODCALLTYPE ReleaseEntryPoint(HENTRY hentry) = 0;
virtual HRESULT STDMETHODCALLTYPE Call(HENTRY hentry, VARIANT *pvarRes, int cvarArgs, VARIANT *prgvarArgs, IDispatch *pdispThis = NULL, ScriptException *pse = NULL, DWORD grfscr = fscrNil) = 0;
virtual HRESULT STDMETHODCALLTYPE Break(void) = 0; virtual HRESULT STDMETHODCALLTYPE Admin(SAdminEnum scad, void *pvArg = NULL, MODID mod = kmodGlobal) = 0; virtual void STDMETHODCALLTYPE SetOutputFunction(PFNOUTPUT pfn, DWORD dwOutput) = 0; virtual HRESULT STDMETHODCALLTYPE SetDefaultDispatch(MODID mod, IDispatch *pdisp) = 0;
// psite may be NULL
virtual void STDMETHODCALLTYPE SetScriptSite(IScriptSite *psite) = 0; #if WIN16
virtual HRESULT STDMETHODCALLTYPE SetActiveScriptSitePoll(IActiveScriptSiteInterruptPoll *pPoll) = 0; #endif // WIN16
virtual void STDMETHODCALLTYPE Enter(void) = 0; virtual void STDMETHODCALLTYPE Leave(void) = 0;
// get an IDispatch wrapper for the module
virtual HRESULT STDMETHODCALLTYPE GetDispatchForModule(MODID mod, IDispatch **ppdisp) = 0;
// Reset/Clone functionality
virtual HRESULT STDMETHODCALLTYPE Reset(void) = 0; virtual HRESULT STDMETHODCALLTYPE Clone(IScript **ppscript) = 0; virtual HRESULT STDMETHODCALLTYPE Execute(ScriptException *pse = NULL) = 0;
#if SCRIPT_DEBUGGER
virtual HRESULT STDMETHODCALLTYPE ToggleBreakPoint(IUnknown *punk, long ich, BP_COMMAND bpcmd, long *pichMin, long *pichLim, BOOL *pfSet) = 0; virtual HRESULT STDMETHODCALLTYPE SetOneTimeBreakOnEntry(BOOL fSet = TRUE) = 0; #endif //SCRIPT_DEBUGGER
virtual HRESULT STDMETHODCALLTYPE GetLineNumber(IUnknown *punk, long ich, long *pline, long *pichMinLine, long *pichLimLine) = 0; virtual HRESULT STDMETHODCALLTYPE GetUserData(IUnknown *punk, BSTR *pbstr) = 0;
#if SUPPORT_SCRIPT_HELPER
#if DBG
virtual HRESULT STDMETHODCALLTYPE DumpPCode(void) = 0; #endif // DBG
#endif // SUPPORT_SCRIPT_HELPER
};
// helper to create a script object
STDAPI CreateScript(IScript **ppscript, PFNOUTPUT pfn = NULL, DWORD dwOutput = 0);
#endif // SCRIPT_H
|