分享
 
 
 

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

王朝vc·作者佚名  2006-01-17
窄屏简体版  字體: |||超大  

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

原著: Ernest Laurentin

翻译:haily

下载源代码

屏幕截图

简介

我总是对脚本控件(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.length0 ? "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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有