Chinaunix首页 | 论坛 | 博客
  • 博客访问: 530693
  • 博文数量: 576
  • 博客积分: 40000
  • 博客等级: 大将
  • 技术积分: 5020
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-13 14:47
文章分类

全部博文(576)

文章存档

2011年(1)

2008年(575)

我的朋友

分类:

2008-10-14 14:58:08

为你的MFC程序添加宏脚本语言


原著: Ernest Laurentin

翻译:





屏幕截图



简介
我总是对脚本控件(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)不能处理所有的类型,所以此函数也不能读取所有的数据类型。也就是说,这个函数只是对数据类型的猜测。

如何使用
要使用这个控件,首先我推荐你看看VBScript和JScript的文档以了解你所有能在脚本语言里能实现的功能。

写一个脚本函数
假设我们想建立一个简单的函数来把温度从华氏度转换到摄氏度:
用 VBScript 写:
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 );
    }
}
一点建议
你可以试试如下的做法:
  • 1、你可以实现象插件一样的实现你的脚本行为,建议你将一个脚本资源放入dll中并在运行时装入(也可以作为你程序的一部分)。由此,你就会有特定模块相关函数,比如:InitModule, ReleaseModule, btnOK_Click, tnCancel_Click, LoadUserData(strUsername), aveUserData(strUserData)等等,并且你的每一个dll将会去执行他们。
  • 2、你可以用你的脚本去完成一个完整的任务,并且你会载入基于你的任务的脚本文件(类CscriptObject可以为你载入一个脚本文件)
    例子: 这个脚本开启"Calculator"程序。
    function StartCalc()
    {
     var WshShell = new ActiveXObject("WScript.Shell");
     var oExec = WshShell.Exec("calc");
         WshShell = null;
    }
        
  • 3. 你可以建立一个ActiveX对象,它的生存期可以比它在一个函数中调用生存期长。
    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);
    }
  • 4. 还有一个情况就是你想直接执行你的脚本,你只要添加代码,不需要写一个函数…你试试把。
参考
Microsoft Windows Script Control
VBScript Documentation
JScript Documentation
--------------------next---------------------

阅读(461) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~