欢迎来到天天文库
浏览记录
ID:1195700
大小:196.00 KB
页数:11页
时间:2017-11-08
《如何在vc程序中嵌入脚本语言(初稿)》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、如何在vc程序中嵌入脚本语言今天很多大型程序中都能够见到内嵌脚本进行二次开发的功能,例如msword,excel,visualstudio等。一直以来我都希望能在自己的程序中加入同样的功能,经过前一段时间的研究,终于有所心得与大家分享。在研究过程中,我查找了www.codeproject.com发现一篇比较有价值的文章(www.codeproject.com/com/mfcscripthost.asp),其中描述了在vc程序中加入脚本语言的过程。其原理如下1.首先使用CoCreateInstance()创建某种脚本语言(javascript,v
2、bscript)的引擎,获得某种语言的脚本引擎的接口IActiveScript。2.实现回调站点接口IActiveScriptSite通过IActiveScript->SetScriptSite()交由脚本引擎回调,在site中可以取得引擎的状态信息,并提供用户的自定义变量的自动化对象。3.通过IActiveScript->QueryInterface()取得IActiveScriptParse接口,IActiveScriptParse用于解释执行用户的脚本代码。幸运的是这一系列接口和操作已经被文章的作者封装成CActiveScriptHost
3、类,只需要掌握CreateEngine()(创建脚本引擎),AddScriptCode()(加入用户脚本代码),AddScriptItem()(加入用户自定义变量)四个常用的方法即可。下面描述如何在自己mfc程序中使用上述类嵌入脚本和自定义脚本对象的过程,步骤如下。1.首先将文章所附例子工程中ActiveScriptHost.cpp,ActiveScriptHost.h,Host_Proxy.cpp,Host_Proxy.h,MFCScriptHost.odl拷贝到当前工程中。2.在当前工程的xxx.rc中加入以下内容,即将类型库加入到程序资源
4、文件中#ifdef_DEBUG1TYPELIB"Debug\MFCScriptHost.tlb"#else1TYPELIB"Release\MFCScriptHost.tlb"#endif3.在需要使用的类成员中加入CHost_Proxym_ScriptProxy;成员,在OnCreate或OnInitDialog中加入m_ScriptProxy.CreateEngine(L"JavaScript");//创建脚本引擎m_ScriptProxy.AddScriptItem(L"test",m_ptestObject->GetUnknown(
5、));//加入名称为test的IDispatch对象1.com对象的生成有两种方案,一种是使用MFC方式生成,即对象从CmdTarget继承,并选中automation的radiobutton(如图表1),并通过ClassWizard中的自动化标签加入方法和属性(如图表2)。这种对象的缺点是无法自定义事件源供脚本程序接收。。图表1图表21.另一种是使用ATL产生com对象,这种方式可以生成带事件功能的对象,此外功能灵活、方便。我更倾向于ATL方式生成com对象。在Classes点击右键选择NewATLObject(如图表3),出现ATLObje
6、ctWizard(如图表4)。选中SimpleObject,出现ATLObjectWizard属性对话框(如图表5),按要求填入shortname(即组件名称),如果欲支持组件的事件功能一定选中SupportConnectionPoints(如图表6),点击确定后vc会自动生成代码。图表3图表4图表5图表61.在vc生成的InitATL()后,一定要手工加入_Module.RegisterTypeLib()用来注册组件的类型库。这是因为TL的IDispatch实现会将自身调用委托给相应组件的类型库接口ITypeInfo去执行(如图表7)。图表7
7、1.如欲实现组件的事件功能还需在相应对象点击ImplementConnectionPoint菜单项(如图表8),选择实现事件源接口(如图表9),点击确定后系统会生成发送出发事件的委托类,并添加相应代码(如图表10)。图表8图表9图表101.因为com对象发出的事件需要在脚本环境下使用,脚本环境需要通过对象的IProvideClassInfo2接口获得默认事件源(即sourcedefaultdispinterface),所以com对象还需实现IProvideClassInfo2接口(如图表11),加入红框内内容即可。图表112.脚本内调用的cod
8、esample例子如下,假设对象test有方法hello,有事件OnRun()javaScript例子test.hello()//调用test对象的h
此文档下载收益归作者所有