2008年(909)
分类:
2008-05-06 21:57:43
下载源代码
屏幕截图
简介
我总是对脚本控件(msscript.ocx)如何使用和当需要使用的时候,C 开发者该如何应对感到惊奇。可能扩展名(.ocx)使他们觉得,那是vb!在本文中,我将解决这些界限,给出 C 开发者使用它的新的理由。
问题描述
由于MS开发者的努力而创造的 Windows 脚本技术,使在VB和 C 应用中使用vbScript和Jscript变得相当简单的。开发者只需要知道如何使用Microsoft脚本控件和如何给一个脚本方法传值就可以了。由此,首先我想要提出的一个包容类是CScriptObject。这个包容类的使用是非常简单的,她提供了你将会在你应用程序中使用的大部分功能。它能提供从文件和资源中中载入脚本(文本数据),得到方法列表,选择脚本语言和执行函数和语句的功能。本类不依赖于MFC,能在控制台程序(console
Application)中使用。
对脚本调用首先最重要的是要了解VBScript和Jscript只能处理VARIANT类型的参数。这就是我建立CSafeArrayHelper类的原因了。CSafeArrayHelper包容类允许你建立你将要传给你的Script函数的的参数。
class CSafeArrayHelper { public: CSafeArrayHelper(); ~CSafeArrayHelper(); bool Create(VARTYPE vt, UINT cDims, UINT lBound, UINT cCount); bool Destroy(); UINT GetDimension(); bool Attach(LPSAFEARRAY psa); bool AttachFromVariant(VARIANT* pVariant); LPSAFEARRAY Detach(); LPSAFEARRAY GetArray(); bool AccessData(void FAR* FAR* pvData); bool UnaccessData(); bool Lock(); bool Unlock(); bool PutElement(long lIndices, void FAR* vData); bool GetElement(long lIndices, void FAR* vData); VARIANT GetAsVariant(); protected: LPSAFEARRAY m_pSA; private: };它提供和SAFEARRAY对象同样的功能,但是它对于我们某些人(比如我)来说,使用更简单。 当你想看你包装在你的SAFEARRAY中的数据类型的时候,函数GetAsVariant可能会很有用。由于SAFEARRAY的数据类型(fFeatures)不能处理所有的类型,所以此函数也不能读取所有的数据类型。也就是说,这个函数只是对数据类型的猜测。
Function Celsius(fDegrees) Celsius = (fDegrees - 32) * 5 / 9 End Function用 JScript 写:
function Celsius(fDegres) { return (fDegres-32)*5/9; }要执行这个函数,只需要把每个变量存储到VARIANT里。由于你的函数(方法)可能包含不止一个参数,我们必须用一个SAFEARRAY来包装它。在后一种情况,你可能想通过检查String函数的.length属性或其他的方法来看数组传给函数的参数的数目。
function CountParam(aParam) { var strPresent = "Parameter is : " (aParam.length>0 ? "Present": "Not present"); return strPresent; }同样的技术可以用在VBScript中,它允许你在运行时检测变长参数。调用无参数的函数,也要创建SAFEARRAY,只是没有参数。 调用一个脚本函数。 你的代码应该和下边的实例一样简单::
void CScriptDemoDlg::OnBtnExecute() { CString strParam, strProc; m_ctlParameter.GetWindowText( strParam ); m_ctlFunctions.GetWindowText( strProc ); CSafeArrayHelper sfHelper; try{ _variant_t var; if (strProc.IsEmpty()) sfHelper.Create(VT_VARIANT, 1, 0, 0); // (void) parameter else { sfHelper.Create(VT_VARIANT, 1, 0, 1); // 1 parameter var = _bstr_t(strParam); } sfHelper.PutElement(0, (void*)&var); // parameter1 -> index 0 LPSAFEARRAY sa = sfHelper.GetArray(); _variant_t varRet; if (m_ScriptObj.RunProcedure(strProc, &sa, &varRet)) m_ctlResult.SetWindowText( (LPCTSTR)(_bstr_t(varRet)) ); else { CString strError = m_ScriptObj.GetErrorString(); m_ctlResult.SetWindowText( strError ); } } catch(...) { CString strError = m_ScriptObj.GetErrorString(); m_ctlResult.SetWindowText( strError ); } }一点建议
function StartCalc() { var WshShell = new ActiveXObject("WScript.Shell"); var oExec = WshShell.Exec("calc"); WshShell = null; }
var XML_Obj; function StartModule() { XML_Obj = new ActiveXObject("Msxml.DOMDocument"); XML_Obj.async = false; } function StopModule() { XML_Obj = null; } function LoadSettings(strFilename) { XML_Obj.load(strFilename); }