- 1、本文档共11页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
如何在vc程序中嵌入脚本语言
今天很多大型程序中都能够见到内嵌脚本进行二次开发的功能,例如ms word,excel,visual studio 等。一直以来我都希望能在自己的程序中加入同样的功能,经过前一段时间的研究,终于有所心得与大家分享。
在研究过程中,我查找了发现一篇比较有价值的文章(/com/mfcscripthost.asp),其中描述了在vc程序中加入脚本语言的过程。
其原理如下
首先使用CoCreateInstance()创建某种脚本语言(javascript,vbscript)的引擎,获得某种语言的脚本引擎的接口IActiveScript。
实现回调站点接口IActiveScriptSite通过IActiveScript-SetScriptSite()交由脚本引擎回调,在site中可以取得引擎的状态信息,并提供用户的自定义变量的自动化对象。
通过IActiveScript-QueryInterface()取得IActiveScriptParse接口,IActiveScriptParse用于解释执行用户的脚本代码。
幸运的是这一系列接口和操作已经被文章的作者封装成CActiveScriptHost类,只需要掌握CreateEngine()(创建脚本引擎),AddScriptCode()(加入用户脚本代码),AddScriptItem()(加入用户自定义变量)四个常用的方法即可。
下面描述如何在自己mfc程序中使用上述类嵌入脚本和自定义脚本对象的过程,步骤如下。
首先将文章所附例子工程中ActiveScriptHost.cpp,ActiveScriptHost.h,Host_Proxy.cpp,Host_Proxy.h,MFCScriptHost.odl拷贝到当前工程中。
在当前工程的xxx.rc中加入以下内容,即将类型库加入到程序资源文件中#ifdef _DEBUG
1 TYPELIB Debug\\MFCScriptHost.tlb
#else
1 TYPELIB Release\\MFCScriptHost.tlb
#endif
在需要使用的类成员中加入CHost_Proxy m_ScriptProxy;成员,在OnCreate或OnInitDialog中加入m_ScriptProxy.CreateEngine( LJavaScript );//创建脚本引擎m_ScriptProxy.AddScriptItem(Ltest,m_ptestObject-GetUnknown());//加入名称为test的IDispatch对象
com对象的生成有两种方案,一种是使用MFC方式生成,即对象从CmdTarget继承,并选中automation的radio button(如图表1),并通过Class Wizard中的自动化标签加入方法和属性(如图表2)。这种对象的缺点是无法自定义事件源供脚本程序接收。。
图表 1
图表 2
另一种是使用ATL产生com对象,这种方式可以生成带事件功能的对象,此外功能灵活、方便。我更倾向于ATL方式生成com对象。在Classes点击右键选择New ATL Object(如图表3),出现ATL Object Wizard(如图表4)。选中SimpleObject, 出现ATL Object Wizard 属性对话框(如图表5),按要求填入short name(即组件名称),如果欲支持组件的事件功能一定选中Support Connection Points(如图表6),点击确定后vc会自动生成代码。
图表 3
图表 4
图表 5
图表 6
在vc生成的InitATL()后,一定要手工加入_Module.RegisterTypeLib()用来注册组件的类型库。这是因为TL的IDispatch实现会将自身调用委托给相应组件的类型库接口ITypeInfo去执行(如图表7)。
图表 7
如欲实现组件的事件功能还需在相应对象点击Implement Connection Point菜单项(如图表8),选择实现事件源接口(如图表9),点击确定后系统会生成发送出发事件的委托类,并添加相应代码(如图表10)。
图表 8
图表 9
图表 10
因为com对象发出的事件需要在脚本环境下使用,脚本环境需要通过对象的IProvideClassInfo2接口获得默认事件源(即source default dispinterface),所以com对象还需实现IProvideClassInfo2接口(如图表11),加入红框内内容即可。
图表 11
脚本内调用的code sample 例子如下,假设对象test有方法hello,有事件OnRun()javaScrip
您可能关注的文档
最近下载
- 出师表格理解性默写.doc VIP
- 电力用直流电源系统蓄电池组远程核容典型接线图、自动核容报告、双向DCDC装置、换流器技术要求.docx VIP
- 路面铣刨摊铺施工方案.pdf VIP
- 首届档案职业技能竞赛考试题库(含答案).docx VIP
- 建筑工程施工技术课件.ppt VIP
- 医院智慧服务分级评估二级实证材料通用模板(选择项部分)(2024版) .doc VIP
- 黑色冶金行业标准YB/T4001.1-2007(钢格栅板).docx VIP
- 旅游景区开发运营项目指标评估报告.docx VIP
- 2024北京市密云区辅警考试真题及答案.docx VIP
- 高速公路服务设施设计规范-2016-7-26标准.pdf VIP
文档评论(0)