Monday, November 08, 2010 at 12:02 AM.

system.verbs.builtins.com.callScript

on callScript (scriptCode, language, mainRoutine, parameters) {
	<<Run an Active Scripting Engine script.
		<<Parameters:
			<<scriptCode is the actual script.
				<<This script should be composed of subroutines and functions.
			<<language is the script's language.
				<<Examples: VBScript, JScript, PerlScript
			<<mainRoutine
				<<The name of the function or subroutine in the script to call.
			<<parameters
				<<A list, the parameters to pass to the script that's called.
		<<Note: the Microsoft Script Control is required.
			<<See http://msdn.microsoft.com/scripting/
	
	local (dllPath = frontier.pathString + "DLLs\\ScriptControlDLL.dll");
	<<local (dllPath = "D:\\Projects\\ScriptControlDLL\\Debug\\ScriptControlDLL.dll")
	local (methodName = "callscript");
	local (result);
	local (flDebug = false);
	
	if typeOf (parameters) != listType {
		scriptError ("Can't call com.callScript because the last parameter must be a list.")};
	
	if flDebug {
		new (outlineType, @temp.scriptControlDllTrace)};
	
	result = dll.call (dllPath, methodName, scriptCode, language, mainRoutine, parameters);
	
	if result endsWith " COM ERROR!" { //this is our flag that an error occurred
		local (errorMessage);
		result = string.mid (result, 1, sizeOf (result) - 11);
		errorMessage = "Can't execute this script because the Script Control reports: \"";
		errorMessage = errorMessage + result + "\"";
		errorMessage = string.replaceAll (errorMessage, "\r\n", "");
		
		if flDebug {
			edit (@temp.scriptControlDllTrace);
			window.zoom (@temp.scriptControlDllTrace);
			
			temp.lastErrorMessage = errorMessage};
		
		scriptError (errorMessage)};
	
	if flDebug {
		edit (@temp.scriptControlDllTrace);
		window.zoom (@temp.scriptControlDllTrace)};
	
	return (result)}
<<bundle //test code
	<<local (s = "Function MyMainRoutine (a, b)\r\nMsgBox (a)\r\nMyMainRoutine = b * 3\r\nEnd Function")
	<<local (x)
	<<x = com.callScript (s, "VBScript", "MyMainRoutine", {"Scripting is fun!", 3})
	<<dialog.notify ("The returned value is " + x + ".")



This listing is for code that runs in the OPML Editor environment. I created these listings because I wanted the search engines to index it, so that when I want to look up something in my codebase I don't have to use the much slower search functionality in my object database. Dave Winer.