{unti AXScript v.1.0 05/28/97 - converted header file for Microsoft ActiveScript.
Original conversion of the ActiveScript header by David Zajac (dzajac@HiWAAY.net)
for Delphi 2.x.
Modified by Brian Dupras (bdupras@dimensional.com) for Delphi 3.0 using interfaces
instead of classes (which was necessary for D2).
This unit is released to the public. No warrenty or guarentee of *anything*
is expressed or implied. Use this code at your own risk - any damage is your
own fault for trusting me. If you find any error in this code, fix it. If
you're nice, let me know about the error so I can fix it, too.
This code has to date (May 28, 1997) only been tested for creating a host for
ActiveScript. I have not tried creating a scripting engine with it (and probably
never will). But I've been able to host both MS JScript and MS VBScript.
Good luck,
Brian Dupras 5/28/97
----------------------------------------------------------------------------------
Ahh..updates. I've updated this unit slilghtly, and created a helper unit called
(and aptly so) AXScriptHelp. The only major additions were those to support
MS IE4. The other updates to this unit were minor - a few slight type differences
and some parameter name changes. Mostly cosmetic stuff.
Again, Good luck,
Brian 7/6/97
By the way, JScript, VBScript and ActiveScript are registered trademarks of
Microsoft Corporation.
----------------------------------------------------------------------------------
More updates still. Thank you Gary Warren King for noticing that I'm an idiot.
The identifiers : SCRIPTTHREADID_CURRENT, SCRIPTTHREADID_BASE, and
SCRIPTTHREADID_ALL were originally thought to be C++ MACROS. Upon second look,
however, they're not macros, they're #define constants that typcast the values
-1, -2, and -3 to the #typdef SCRIPTTHREADID. Looking into another's activescript
conversion confirmed this, so the change has been made and duely noted.
We'll call this version 1.1 of the ActivScp.h conversion.
Brian Dupras 8/26/97
p.s. At the time of this writing, a slightly older demo using this header is
available at the Delphi Super Page. The URL is
http://SunSITE.icm.edu.pl/delphi/, and the file is axscpd1.zip. It can be
found under Delphi 3, Apps With Sources. I plan to pust axscpd2.zip real soon
now, so get that one if it's there.
}
unit AXScript;
interface
uses
Windows, ActiveX;
const
//Category IDs
CATID_ActiveScript:TGUID= '{F0B7A1A1-9847-11cf-8F20-00805F2CD064}';
CATID_ActiveScriptParse:TGUID= '{F0B7A1A2-9847-11cf-8F20-00805F2CD064}';
//Interface IDs
IID_IActiveScriptSite:TGUID= '{DB01A1E3-A42B-11cf-8F20-00805F2CD064}';
IID_IActiveScriptSiteWindow:TGUID= '{D10F6761-83E9-11cf-8F20-00805F2CD064}';
IID_IActiveScript:TGUID= '{BB1A2AE1-A4F9-11cf-8F20-00805F2CD064}';
IID_IActiveScriptParse:TGUID= '{BB1A2AE2-A4F9-11cf-8F20-00805F2CD064}';
IID_IActiveScriptParseProcedure:TGUID= '{1CFF0050-6FDD-11d0-9328-00A0C90DCAA9}';
IID_IActiveScriptError:TGUID= '{EAE1BA61-A4ED-11cf-8F20-00805F2CD064}';
// Constants used by ActiveX Scripting:
SCRIPTITEM_ISVISIBLE = $00000002;
SCRIPTITEM_ISSOURCE = $00000004;
SCRIPTITEM_GLOBALMEMBERS = $00000008;
SCRIPTITEM_ISPERSISTENT = $00000040;
SCRIPTITEM_CODEONLY = $00000200;
SCRIPTITEM_NOCODE = $00000400;
SCRIPTITEM_ALL_FLAGS = (SCRIPTITEM_ISSOURCE or
SCRIPTITEM_ISVISIBLE or
SCRIPTITEM_ISPERSISTENT or
SCRIPTITEM_GLOBALMEMBERS or
SCRIPTITEM_NOCODE or
SCRIPTITEM_CODEONLY);
// IActiveScript::AddTypeLib() input flags
SCRIPTTYPELIB_ISCONTROL = $00000010;
SCRIPTTYPELIB_ISPERSISTENT = $00000040;
SCRIPTTYPELIB_ALL_FLAGS = (SCRIPTTYPELIB_ISCONTROL or
SCRIPTTYPELIB_ISPERSISTENT);
// IActiveScriptParse::AddScriptlet() and IActiveScriptParse::ParseScriptText() input flags */
SCRIPTTEXT_DELAYEXECUTION = $00000001;
SCRIPTTEXT_ISVISIBLE = $00000002;
SCRIPTTEXT_ISEXPRESSION = $00000020;
SCRIPTTEXT_ISPERSISTENT = $00000040;
SCRIPTTEXT_HOSTMANAGESSOURCE = $00000080;
SCRIPTTEXT_ALL_FLAGS = (SCRIPTTEXT_DELAYEXECUTION or
SCRIPTTEXT_ISVISIBLE or
SCRIPTTEXT_ISEXPRESSION or
SCRIPTTEXT_HOSTMANAGESSOURCE or
SCRIPTTEXT_ISPERSISTENT);
// IActiveScriptParseProcedure::ParseProcedureText() input flags
SCRIPTPROC_HOSTMANAGESSOURCE = $00000080;
SCRIPTPROC_IMPLICIT_THIS = $00000100;
SCRIPTPROC_IMPLICIT_PARENTS = $00000200;
SCRIPTPROC_ALL_FLAGS = (SCRIPTPROC_HOSTMANAGESSOURCE or
SCRIPTPROC_IMPLICIT_THIS or
SCRIPTPROC_IMPLICIT_PARENTS);
// IActiveScriptSite::GetItemInfo() input flags */
SCRIPTINFO_IUNKNOWN = $00000001;
SCRIPTINFO_ITYPEINFO = $00000002;
SCRIPTINFO_ALL_FLAGS = (SCRIPTINFO_IUNKNOWN or
SCRIPTINFO_ITYPEINFO);
// IActiveScript::Interrupt() Flags */
SCRIPTINTERRUPT_DEBUG = $00000001;
SCRIPTINTERRUPT_RAISEEXCEPTION = $00000002;
SCRIPTINTERRUPT_ALL_FLAGS = (SCRIPTINTERRUPT_DEBUG or
SCRIPTINTERRUPT_RAISEEXCEPTION);
type
//new IE4 types
TUserHWND=HWND;
TUserBSTR=TBStr;
TUserExcepInfo=TExcepInfo;
TUserVariant=OleVariant;
// script state values
TScriptState = (
SCRIPTSTATE_UNINITIALIZED,
SCRIPTSTATE_STARTED,
SCRIPTSTATE_CONNECTED,
SCRIPTSTATE_DISCONNECTED,
SCRIPTSTATE_CLOSED,
SCRIPTSTATE_INITIALIZED
);
// script thread state values */
TScriptThreadState = (
SCRIPTTHREADSTATE_NOTINSCRIPT,
SCRIPTTHREADSTATE_RUNNING
);
// Thread IDs */
TScriptThreadID = DWORD;
const //Note: these SCRIPTTHREADID constants were originally macros
//in the first version of this file. See the note at the top
//for more information. (Thanks to Gary Warren King.)
SCRIPTTHREADID_CURRENT = TScriptThreadId(-1);
SCRIPTTHREADID_BASE = TScriptThreadId(-2);
SCRIPTTHREADID_ALL = TScriptThreadId(-3);
type
//Forward declarations
IActiveScript = interface;
IActiveScriptParse = interface;
IActiveScriptParseProcedure = interface;
IActiveScriptSite = interface;
IActiveScriptSiteWindow = interface;
IActiveScriptError = interface;
IActiveScriptError = interface(IUnknown)
['{EAE1BA61-A4ED-11CF-8F20-00805F2CD064}']
// HRESULT GetExceptionInfo(
// [out] EXCEPINFO *pexcepinfo);
function GetExceptionInfo(out ExcepInfo: TExcepInfo): HRESULT; stdcall;
// HRESULT GetSourcePosition(
// [out] DWORD *pdwSourceCOntext,
// [out] ULONG *pulLineNumber,
// [out] LONG *plCharacterPosition);
function GetSourcePosition(out SourceContext: DWORD; out LineNumber: ULONG; out CharacterPosition: LONGINT): HRESULT; stdcall;
// HRESULT GetSourceLineText(
// [out] BSTR *pbstrSourceLine);
function GetSourceLineText(out SourceLine: LPWSTR): HRESULT; stdcall;
end; //IActiveScriptError interface
IActiveScriptSite = Interface(IUnknown)
['{DB01A1E3-A42B-11CF-8F20-00805F2CD064}']
// HRESULT GetLCID(
// [out] LCID *plcid);
// Allows the host application to indicate the local ID for localization
// of script/user interaction
function GetLCID(out Lcid: TLCID): HRESULT; stdcall;
// HRESULT GetItemInfo(
// [in] LPCOLESTR pstrName,
// [in] DWORD dwReturnMask,
// [out] IUnknown **ppiunkItem,
// [out] ITypeInfo **ppti);
// Called by the script engine to look up named items in host application.
// Used to map unresolved variable names in scripts to automation interface
// in host application. The dwReturnMask parameter will indicate whether
// the actual object (SCRIPTINFO_INKNOWN) or just a coclass type description
// (SCRIPTINFO_ITYPEINFO) is desired.
function GetItemInfo(const pstrName: POleStr; dwReturnMask: DWORD; out ppiunkItem: IUnknown; out Info: ITypeInfo): HRESULT; stdcall;
// HRESULT GetDocVersionString(
// [out] BSTR *pbstrVersion);
// Called by the script engine to get a text-based version number of the
// current document. This string can be used to validate that any cached
// state that the script engine may have saved is consistent with the
// current document.
function GetDocVersionString(out Version: TBSTR): HRESULT; stdcall;
// HRESULT OnScriptTerminate(
// [in] const VARIANT *pvarResult,
// [in] const EXCEPINFO *pexcepinfo);
// Called by the script engine when the script terminates. In most cases
// this method is not called, as it is possible that the parsed script may
// be used to dispatch events from the host application
function OnScriptTerminate(const pvarResult: OleVariant; const pexcepinfo: TExcepInfo): HRESULT; stdcall;
// HRESULT OnStateChange(
// [in] SCRIPTSTATE ssScriptState);
// Called by the script engine when state changes either explicitly via
// SetScriptState or implicitly via other script engine events.
function OnStateChange(ScriptState: TScriptState): HRESULT; stdcall;
// HRESULT OnScriptError(
// [in] IActiveScriptError *pscripterror);
// Called when script execution or parsing encounters an error. The script
// engine will provide an implementation of IActiveScriptError that
// describes the runtime error in terms of an EXCEPINFO in addition to
// indicating the location of the error in the original script text.
function OnScriptError(const pscripterror: IActiveScriptError): HRESULT; stdcall;
// HRESULT OnEnterScript(void);
// Called by the script engine to indicate the beginning of a unit of work.
function OnEnterScript: HRESULT; stdcall;
// HRESULT OnLeaveScript(void);
// Called by the script engine to indicate the completion of a unit of work.
function OnLeaveScript: HRESULT; stdcall;
end; //IActiveScriptSite interface
IActiveScriptSiteWindow = interface(IUnknown)
['{D10F6761-83E9-11CF-8F20-00805F2CD064}']
// HRESULT GetWindow(
// [out] HWND *phwnd);
function GetWindow(out Handle: HWND): HRESULT; stdcall;
// HRESULT EnableModeless(
// [in] BOOL fEnable);
function EnableModeless(fEnable: BOOL): HRESULT; stdcall;
end; //IActiveScriptSiteWindow interface
IActiveScript = interface(IUnknown)
['{BB1A2AE1-A4F9-11CF-8F20-00805F2CD064}']
// HRESULT SetScriptSite(
// [in] IActiveScriptSite *pass);
// Conects the host's application site object to the engine
function SetScriptSite(ActiveScriptSite: IActiveScriptSite): HRESULT; stdcall;
// HRESULT GetScriptSite(
// [in] REFIID riid,
// [iid_is][out] void **ppvObject);
// Queries the engine for the connected site
function GetScriptSite(riid: TGUID; out OleObject: Pointer): HRESULT; stdcall;
// HRESULT SetScriptState(
// [in] SCRIPTSTATE ss);
// Causes the engine to enter the designate state
function SetScriptState(State: TScriptState): HRESULT; stdcall;
// HRESULT GetScriptState(
// [out] SCRIPTSTATE *pssState);
// Queries the engine for its current state
function GetScriptState(out State: TScriptState): HRESULT; stdcall;
// HRESULT Close(void);
// Forces the engine to enter the closed state, resetting any parsed scripts
// and disconnecting/releasing all of the host's objects.
function Close: HRESULT; stdcall;
// HRESULT AddNamedItem(
// [in] LPCOLESTR pstrName,
// [in] DWORD dwFlags);
// Adds a variable name to the namespace of the script engine. The engine
// will call the site's GetItemInfo to resolve the name to an object.
function AddNamedItem(Name: POleStr; Flags: DWORD): HRESULT; stdcall;
// HRESULT AddTypeLib(
// [in] REFGUID rguidTypeLib,
// [in] DWORD dwMajor,
// [in] DWORD dwMinor,
// [in] DWORD dwFlags);
// Adds the type and constant defintions contained in the designated type
// library to the namespace of the scripting engine.
function AddTypeLib(TypeLib: TGUID; Major: DWORD; Minor: DWORD; Flags: DWORD): HRESULT; stdcall;
// HRESULT GetScriptDispatch(
// [in] LPCOLESTR pstrItemName,
// [out] IDispatch **ppdisp);
// Gets the IDispatch pointer to the scripting engine.
function GetScriptDispatch(ItemName: POleStr; out Disp: IDispatch): HRESULT; stdcall;
// HRESULT GetCurrentScriptThreadID(
// [out] SCRIPTTHREADID *pstidThread);
// Gets the script's logical thread ID that corresponds to the current
// physical thread. This allows script engines to execute script code on
// arbitrary threads that may be distinct from the site's thread.
function GetCurrentScriptThreadID(out Thread: TScriptThreadID): HRESULT; stdcall;
// HRESULT GetScriptThreadID(
// [in] DWORD dwWin32ThreadID,
// [out] SCRIPTTHREADID *pstidThread);
// Gets the logical thread ID that corresponds to the specified physical
// thread. This allows script engines to execute script code on arbitrary
// threads that may be distinct from the sites thread.
function GetScriptThreadID(Win32ThreadID: DWORD; out Thread: TScriptThreadID): HRESULT; stdcall;
// HRESULT GetScriptThreadState(
// [in] SCRIPTTHREADID stidThread,
// [out] SCRIPTTHREADSTATE *pstsState);
// Gets the logical thread ID running state, which is either
// SCRIPTTHREADSTATE_NOTINSCRIPT or SCRIPTTHEADSTATE_RUNNING.
function GetScriptThreadState(Thread: TScriptThreadID; out State: TScriptThreadState): HRESULT; stdcall;
// HRESULT InterruptScriptThread(
// [in] SCRIPTTHREADID stidThread,
// [in] const EXCEPINFO *pexcepInfo,
// [in] DWORD dwFlags);
// Similar to Terminatethread, this method stope the execution of a script thread.
function InterruptScriptThread(Thread: TScriptThreadID; const ExcepInfo: TExcepInfo; Flags: DWORD): HRESULT; stdcall;
// HRESULT Clone(
// [out] IActiveScript **ppscript);
// Duplicates the current script engine, replicating any parsed script text
// and named items, but no the actual pointers to the site's objects.
function Clone(out ActiveScript: IActiveScript): HRESULT; stdcall;
end; //IActiveScript interface
IActiveScriptParse = interface(IUnknown)
['{BB1A2AE2-A4F9-11CF-8F20-00805F2CD064}']
// HRESULT InitNew(void);
function InitNew: HRESULT; stdcall;
// HRESULT AddScriptlet(
// [in] LPCOLESTR pstrDefaultName,
// [in] LPCOLESTR pstrCode,
// [in] LPCOLESTR pstrItemName,
// [in] LPCOLESTR pstrSubItemName,
// [in] LPCOLESTR pstrEventName,
// [in] LPCOLESTR pstrDelimiter,
// [in] DWORD dwSourceContextCookie,
// [in] ULONG ulStartingLineNumber,
// [in] DWORD dwFlags,
// [out] BSTR *pbstrName,
// [out] EXCEPINFO *pexcepinfo);
function AddScriptlet(
DefaultName: POleStr;
Code: POleStr;
ItemName: POleStr;
SubItemName: POleStr;
EventName: POleStr;
Delimiter: POleStr;
SourceContextCookie: DWORD;
StartingLineNnumber: ULONG;
Flags: DWORD;
out Name: TBSTR;
out ExcepInfo: TExcepInfo
): HRESULT; stdcall;
// HRESULT STDMETHODCALLTYPE ParseScriptText(
// [in] LPCOLESTR pstrCode,
// [in] LPCOLESTR pstrItemName,
// [in] IUnknown *punkContext,
// [in] LPCOLESTR pstrDelimiter,
// [in] DWORD dwSourceContextCookie,
// [in] ULONG ulStartingLineNumber,
// [in] DWORD dwFlags,
// [out] VARIANT *pvarResult,
// [out] EXCEPINFO *pexcepinfo);
function ParseScriptText(
const pstrCode: POLESTR;
const pstrItemName: POLESTR;
const punkContext: IUnknown;
const pstrDelimiter: POLESTR;
dwSourceContextCookie: DWORD;
ulStartingLineNumber: ULONG;
dwFlags: DWORD;
out pvarResult: OleVariant;
out pExcepInfo: TExcepInfo
): HRESULT; stdcall;
end; //IActivScriptParse interface
IActiveScriptParseProcedure=interface(IUnknown)
['{1CFF0050-6FDD-11d0-9328-00A0C90DCAA9}']
function ParseProcedureText(
const pstrCode: POLESTR;
const pstrFormalParams: POLESTR;
const pstrItemName: POLESTR;
punkContext: IUnknown;
const pstrDelimiter: POLESTR;
dwSourceContextCookie: DWord;
ulStartingLineNumber: ULong;
dwFlags: DWord;
out ppdisp: IDispatch
): HResult; stdcall;
end; //IActivScriptParseProcedure interface
implementation
end.