如何在vc程序中嵌入脚本语言(初稿).doc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 如何 vc 程序 嵌入 脚本语言 初稿
- 资源描述:
-
如何在vc程序中嵌入脚本语言 今天很多大型程序中都能够见到内嵌脚本进行二次开发的功能,例如ms word,excel,visual studio 等。一直以来我都希望能在自己的程序中加入同样的功能,经过前一段时间的研究,终于有所心得与大家分享。 在研究过程中,我查找了发现一篇比较有价值的文章( 其原理如下 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 _DEBUG 1 TYPELIB "Debug\\MFCScriptHost.tlb" #else 1 TYPELIB "Release\\MFCScriptHost.tlb" #endif 3. 在需要使用的类成员中加入CHost_Proxy m_ScriptProxy;成员,在OnCreate或OnInitDialog中加入 m_ScriptProxy.CreateEngine( L"JavaScript" );//创建脚本引擎 m_ScriptProxy.AddScriptItem(L"test",m_ptestObject->GetUnknown());//加入名称为test的IDispatch对象 4. com对象的生成有两种方案,一种是使用MFC方式生成,即对象从CmdTarget继承,并选中automation的radio button(如图表1),并通过Class Wizard中的自动化标签加入方法和属性(如图表2)。这种对象的缺点是无法自定义事件源供脚本程序接收。。 图表 1 图表 2 5. 另一种是使用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 6. 在vc生成的InitATL()后,一定要手工加入_Module.RegisterTypeLib()用来注册组件的类型库。这是因为TL的IDispatch实现会将自身调用委托给相应组件的类型库接口ITypeInfo去执行(如图表7)。 图表 7 7. 如欲实现组件的事件功能还需在相应对象点击Implement Connection Point菜单项(如图表8),选择实现事件源接口(如图表9),点击确定后系统会生成发送出发事件的委托类,并添加相应代码(如图表10)。 图表 8 图表 9 图表 10 8. 因为com对象发出的事件需要在脚本环境下使用,脚本环境需要通过对象的IProvideClassInfo2接口获得默认事件源(即source default dispinterface),所以com对象还需实现IProvideClassInfo2接口(如图表11),加入红框内内容即可。 图表 11 9. 脚本内调用的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 Sub Jscript与VbScript详细用法见 msdn/platform SDK documentation/Tools and Scripting/Scripting 10. 如果使用mfc方式生成的com对象,用以下代码将对象作为脚本变量加入到脚本环境中 m_ScriptProxy.AddScriptItem(L"testctrl",m_ctrl.GetIDispatch(FALSE)); 11. 如果使用ATL方式生成的com对象,用以下代码将对象作为脚本变量加入到脚本环境中 CComObject<CAtlEventObject>::CreateInstance(&m_peventObject); //因为多步骤构造需要调用finalContruct m_ScriptProxy.AddScriptItem(L"event",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,CAtlRect class ATL_NO_VTABLE CAtlButton : public CComObjectRootEx<CComSingleThreadModel>, public CComCoClass<CAtlButton, &CLSID_AtlButton>, public IConnectionPointContainerImpl<CAtlButton>, public IDispatchImpl<IAtlButton, &IID_IAtlButton, &LIBID_MFCScriptHost> { // IAtlButton public: STDMETHOD(Move)(/*[in]*/IAtlRect* rect);//移动button STDMETHOD(get_Rect)(/*[out, retval]*/ IAtlRect* *pVal);//得到button size }; class ATL_NO_VTABLE CAtlRect : public CComObjectRootEx<CComSingleThreadModel>, public CComCoClass<CAtlRect, &CLSID_AtlRect>, public IDispatchImpl<IAtlRect, &IID_IAtlRect, &LIBID_MFCScriptHost> { public: 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 CComObjectGlobal<CAtlButton> { public: 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<CAtlRect>* pRect; CComObject<CAtlRect>::CreateInstance(&pRect); pRect->m_rc = rc; pRect->QueryInterface(pVal); return S_OK; } STDMETHODIMP CButtonWithAtl::Move(IAtlRect *rect) { CRect rc; CComPtr<IAtlRect> ptr(rect); ptr->get_Left(&rc.left); ptr->get_Top(&rc.top); ptr->get_Right(&rc.right); ptr->get_Bottom(&rc.bottom); this->MoveWindow(rc); return S_OK; } 加入代码 CButtonWithAtl m_btnRun; m_ScriptProxy.AddScriptItem(L"runbtn",m_btnRun.GetUnknown()); javaScript test code 为 var rc = runbtn.Rect; rc.right += 10; //按钮宽度每次增加10pixel runbtn.Move(rc);展开阅读全文
咨信网温馨提示:1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。




如何在vc程序中嵌入脚本语言(初稿).doc



实名认证













自信AI助手
















微信客服
客服QQ
发送邮件
意见反馈



链接地址:https://www.zixin.com.cn/doc/7180751.html