




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
如何在vc程序中嵌入脚本语言今天很多大型程序中都能够见到内嵌脚本进行二次开发的功能,例如ms word,excel,visual studio 等。一直以来我都希望能在自己的程序中加入同样的功能,经过前一段时间的研究,终于有所心得与大家分享。在研究过程中,我查找了发现一篇比较有价值的文章(/com/mfcscripthost.asp),其中描述了在vc程序中加入脚本语言的过程。其原理如下1. 首先使用CoCreateInstance()创建某种脚本语言(javascript,vbscript)的引擎,获得某种语言的脚本引擎的接口IActiveScript。2. 实现回调站点接口IActiveScriptSite通过IActiveScript-SetScriptSite()交由脚本引擎回调,在site中可以取得引擎的状态信息,并提供用户的自定义变量的自动化对象。3. 通过IActiveScript-QueryInterface()取得IActiveScriptParse接口,IActiveScriptParse用于解释执行用户的脚本代码。幸运的是这一系列接口和操作已经被文章的作者封装成CActiveScriptHost类,只需要掌握CreateEngine()(创建脚本引擎),AddScriptCode()(加入用户脚本代码),AddScriptItem()(加入用户自定义变量)四个常用的方法即可。下面描述如何在自己mfc程序中使用上述类嵌入脚本和自定义脚本对象的过程,步骤如下。1. 首先将文章所附例子工程中ActiveScriptHost.cpp,ActiveScriptHost.h,Host_Proxy.cpp,Host_Proxy.h,MFCScriptHost.odl拷贝到当前工程中。2. 在当前工程的xxx.rc中加入以下内容,即将类型库加入到程序资源文件中#ifdef _DEBUG1 TYPELIB DebugMFCScriptHost.tlb#else1 TYPELIB ReleaseMFCScriptHost.tlb#endif3. 在需要使用的类成员中加入CHost_Proxym_ScriptProxy;成员,在OnCreate或OnInitDialog中加入m_ScriptProxy.CreateEngine( LJavaScript );/创建脚本引擎m_ScriptProxy.AddScriptItem(Ltest,m_ptestObject-GetUnknown();/加入名称为test的IDispatch对象4. com对象的生成有两种方案,一种是使用MFC方式生成,即对象从CmdTarget继承,并选中automation的radio button(如图表1),并通过Class Wizard中的自动化标签加入方法和属性(如图表2)。这种对象的缺点是无法自定义事件源供脚本程序接收。图表 1图表 25. 另一种是使用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图表 66. 在vc生成的InitATL()后,一定要手工加入_Module.RegisterTypeLib()用来注册组件的类型库。这是因为TL的IDispatch实现会将自身调用委托给相应组件的类型库接口ITypeInfo去执行(如图表7)。图表 77. 如欲实现组件的事件功能还需在相应对象点击Implement Connection Point菜单项(如图表8),选择实现事件源接口(如图表9),点击确定后系统会生成发送出发事件的委托类,并添加相应代码(如图表10)。图表 8图表 9图表 108. 因为com对象发出的事件需要在脚本环境下使用,脚本环境需要通过对象的IProvideClassInfo2接口获得默认事件源(即source default dispinterface),所以com对象还需实现IProvideClassInfo2接口(如图表11),加入红框内内容即可。图表 119. 脚本内调用的code sample 例子如下,假设对象test有方法hello,有事件OnRun()javaScript 例子test.hello() /调用test对象的hello方法function test:OnRun()/test对象事件OnRun()的回调函数vbScript 例子test.hello 调用test对象的hello方法Sub test_OnRun() test对象事件OnRun()的回调函数end SubJscript与VbScript详细用法见msdn/platform SDK documentation/Tools and Scripting/Scripting10. 如果使用mfc方式生成的com对象,用以下代码将对象作为脚本变量加入到脚本环境中m_ScriptProxy.AddScriptItem(Ltestctrl,m_ctrl.GetIDispatch(FALSE);11. 如果使用ATL方式生成的com对象,用以下代码将对象作为脚本变量加入到脚本环境中CComObject:CreateInstance(&m_peventObject); /因为多步骤构造需要调用finalContructm_ScriptProxy.AddScriptItem(Levent,m_peventObject-GetUnknown();12. 脚本代码的接入方法,strScriptText为代码脚本CString strScriptText;m_ctlScriptText.GetWindowText( strScriptText );if (strScriptText.GetLength()0)BSTR bstrText = strScriptText.AllocSysString();m_ScriptProxy.AddScriptCode(bstrText);SysFreeString(bstrText);下面简要介绍将一个MFC 的CButton 变为脚本中可用组件的方法用上述步骤建立CAtlButton,CAtlRectclass ATL_NO_VTABLE CAtlButton : public CComObjectRootEx,public CComCoClass,public IConnectionPointContainerImpl,public IDispatchImpl/ IAtlButtonpublic:STDMETHOD(Move)(/*in*/IAtlRect* rect);/移动buttonSTDMETHOD(get_Rect)(/*out, retval*/ IAtlRect* *pVal);/得到button size;class ATL_NO_VTABLE CAtlRect : public CComObjectRootEx,public CComCoClass,public IDispatchImplpublic:CRect m_rc;public:STDMETHOD(get_Bottom)(/*out, retval*/ long *pVal);STDMETHOD(put_Bottom)(/*in*/ long newVal);STDMETHOD(get_Right)(/*out, retval*/ long *pVal);STDMETHOD(put_Right)(/*in*/ long newVal);STDMETHOD(get_Left)(/*out, retval*/ long *pVal);STDMETHOD(put_Left)(/*in*/ long newVal);STDMETHOD(get_Top)(/*out, retval*/ long *pVal);STDMETHOD(put_Top)(/*in*/ long newVal);class CButtonWithAtl : public CButton,public CComObjectGlobalpublic:STDMETHOD(get_Rect)(/*out, retval*/ IAtlRect* *pVal);STDMETHOD(Move)(/*in*/IAtlRect* rect);CComObjectGlobal表示com对象全局生存不需要引用计数,CComObject表示在堆上创建对象,通过引用计数控制生命周期。STDMETHODIMP CButtonWithAtl:get_Rect(IAtlRect *pVal)CRect rc;this-GetWindowRect(rc);this-GetParent()-ScreenToClient(rc);CComObject* pRect;CComObject:CreateInstance(&pRect);pRect-m_rc = rc;pRect-QueryInterface(pVal);return S_OK;STDMETHODIMP CButtonWithAtl:Move(IAtlRect *rect)CRect rc;CComPtr ptr(rect);ptr-get_Left(&rc.left);ptr-get_Top(&rc.top);ptr-get_Right(&rc.right);ptr-get_Bottom(&
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年安全生产GMP认证模拟练习题及答案
- 2025年健康管理顾问资格认证考试试题及答案解析
- 2025年建筑施工现场监理员专业能力测评试题及答案解析
- 2025年家政服务员职业技能考试试题及答案解析
- 机电行业外贸知识培训班课件
- 2025年宠物音乐疗愈师初级面试模拟题及答案
- 2025年广告文案策划师职业水平评定试题及答案解析
- 中学语文教学通讯课件
- 如何写好讲解课件教学
- 课件上的秘密
- 构图方法对竖屏短视频视觉效果的提升
- 职业道德与法治中职PPT完整全套教学课件
- 惠州卫生职业技术学院工作人员招聘考试真题2022
- 三级创业指导师考试复习题库(500题)
- 2022年北京语言大学各单位新编长聘人员招聘需求笔试备考题库及答案解析
- 部编版小学语文四年级上册课程纲要
- GB/T 31997-2015风力发电场项目建设工程验收规程
- HG20615-RF法兰标准尺寸
- 三尖瓣下移畸形(Ebstein畸形)
- 计算机组装与维护完整版课件(全)
- 一键自动生成spccpkMSAPPK数据工具
评论
0/150
提交评论