为应用程序添加脚本支持.doc_第1页
为应用程序添加脚本支持.doc_第2页
为应用程序添加脚本支持.doc_第3页
为应用程序添加脚本支持.doc_第4页
为应用程序添加脚本支持.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

为应用程序添加脚本支持 2006年07月21日 PowerCPP1 2 下一页 本文示例源代码或素材下载代码运行效果图如下:介绍有时我们并不需要提供完整的脚本支持,就像本文所要介绍的ActiveX脚本宿主(script hosting,可能称为脚本引擎更好理解),本文提供的ScriptControlMacro程序展示了使用Microsoft脚本控件简单地实现脚本支持功能,代码中还包括了以下一些技术:用文件映射实现只允许一个应用实例.如何用MFC存储读取二进制注册表数据如何保存恢复应用程序窗口尺寸,位置如何在CEditView派生类中使用不同地字体如何捕捉OLE异常并显示错误信息等.开始前的准备这篇文章假定你已经对COM、ActiveX控件、OLE自动化有所熟悉,并知道如何在MFC里使用他们。因为这些技术包含了相当多的内容,因此你应该先学习一下这些内容再来看本文。基本步骤:1、建立一个提供ActiveX控件支持的新的MFC工程2、使用ClassWizard从脚本控件类型库中建立一个dispatch类ClassWizard将为脚本控件接口生成头文件与执行文件。 / Machine generated IDispatch wrapper class(es) created with/ ClassWizard/ IScriptControl wrapper classclass IScriptControl : public COleDispatchDriver/ Operationspublic:void SetLanguage(LPCTSTR lpszNewValue);void SetSitehWnd(HWND hWnd);LPDISPATCH GetError();void AddObject(LPCTSTR Name, LPDISPATCH Object, BOOL AddMembers);void AddCode(LPCTSTR Code);/ Machine generated IDispatch wrapper class(es) created/ with ClassWizard#include stdafx.h#include MSScriptControl.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ IScriptControl operationsvoid IScriptControl:SetLanguage(LPCTSTR lpszNewValue)static BYTE parms =VTS_BSTR;InvokeHelper(0x5dc, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,lpszNewValue);void IScriptControl:SetSitehWnd(HWND hWnd)static BYTE parms =VTS_I4;InvokeHelper(0x5de, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,hWnd);LPDISPATCH IScriptControl:GetError()LPDISPATCH result;InvokeHelper(0x5e3, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);return result;void IScriptControl:AddObject(LPCTSTR Name, LPDISPATCH Object, BOOL AddMembers)static BYTE parms =VTS_BSTR VTS_DISPATCH VTS_BOOL;InvokeHelper(0x9c4, DISPATCH_METHOD, VT_EMPTY, NULL, parms, Name, Object, AddMembers);void IScriptControl:AddCode(LPCTSTR Code)static BYTE parms =VTS_BSTR;InvokeHelper(0x7d0, DISPATCH_METHOD, VT_EMPTY, NULL, parms,Code);3、删除类中不需要的IDispatch封装的方法4、如果你想自己添加函数,可以用ClassWizard添加一个自动化类。ClasWizard将为IDispatch接口产生如下头文件与执行文件:/ ScriptControlMacroDispatch.h : interface of the/ CScriptControlMacroDispatch class/#if !defined(AFX_SCRIPTCONTROLMACRODISPATCH_H_FB55B5AF_00E5_47F5_B176_214B2C7BF19A_INCLUDED_)#define AFX_SCRIPTCONTROLMACRODISPATCH_H_FB55B5AF_00E5_47F5_B176_214B2C7BF19A_INCLUDED_#if _MSC_VER 1000#pragma once#endif/ _MSC_VER 1000/ CScriptControlMacroDispatch command targetclass CScriptControlMacroDispatch : public CCmdTargetDECLARE_DYNCREATE(CScriptControlMacroDispatch)CScriptControlMacroDispatch(); / protected constructor used by dynamic creation/ Overrides/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CScriptControlMacroDispatch)/AFX_VIRTUAL/ Implementationprotected:/friend class CScriptControlMacroView;/ Generated message map functions/AFX_MSG(CScriptControlMacroDispatch)/ NOTE - the ClassWizard will add and remove member/ functions here./AFX_MSGDECLARE_MESSAGE_MAP()/ Generated OLE dispatch map functions/AFX_DISPATCH(CScriptControlMacroDispatch)afx_msg void Test1();afx_msg void Test2();/AFX_DISPATCHDECLARE_DISPATCH_MAP()DECLARE_INTERFACE_MAP();/ Note: we add support for IID_IScriptControlMacroDispatch/ to support typesafe binding from VBA. This IID must match/ the GUID that is attached to the dispinterface in the/ .ODL file./ 69AA5686-41AF-4CD9-AEAE-9DB88130E7C1static const IID IID_IScriptControlMacroDispatch =0x69AA5686, 0x41AF, 0x4CD9, 0xAE, 0xAE, 0x9D, 0xB8,0x81, 0x30, 0xE7, 0xC1;/AFX_INSERT_LOCATION/ Microsoft Visual C+ will insert additional declarations/ immediately before the previous line.#endif/ !defined(AFX_SCRIPTCONTROLMACRODISPATCH_H_/ FB55B5AF_00E5_47F5_B176_214B2C7BF19A_INCLUDED_)/ ScriptControlMacroDispatch.cpp : implementation of the/ CScriptControlMacroDispatch class/#include stdafx.h#include ScriptControlMacroDispatch.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CScriptControlMacroDispatchIMPLEMENT_DYNCREATE(CScriptControlMacroDispatch, CCmdTarget)CScriptControlMacroDispatch:CScriptControlMacroDispatch()EnableAutomation();BEGIN_MESSAGE_MAP(CScriptControlMacroDispatch, CCmdTarget)/AFX_MSG_MAP(CScriptControlMacroDispatch)/ NOTE - the ClassWizard will add and remove mapping/ macros here./AFX_MSG_MAPEND_MESSAGE_MAP()BEGIN_DISPATCH_MAP(CScriptControlMacroDispatch, CCmdTarget)/AFX_DISPATCH_MAP(CScriptControlMacroDispatch)DISP_FUNCTION(CScriptControlMacroDispatch,Test1, Test1, VT_EMPTY, VTS_NONE)DISP_FUNCTION(CScriptControlMacroDispatch,Test2, Test2, VT_EMPTY, VTS_NONE)/AFX_DISPATCH_MAPEND_DISPATCH_MAP()BEGIN_INTERFACE_MAP(CScriptControlMacroDispatch, CCmdTarget)INTERFACE_PART(CScriptControlMacroDispatch, IID_IScriptControlMacroDispatch, Dispatch)END_INTERFACE_MAP()/ CScriptControlMacroDispatch message handlersvoid CScriptControlMacroDispatch:Test1()/ TODO: Add your dispatch handler code hereAfxMessageBox(CString(_T() + GetDispatchMap()-lpEntries-lpszName + _T( method call ofthe ) + RUNTIME_CLASS(CScriptControlMacroDispatch)-m_lpszClassName+ _T( class), MB_ICONASTERISK);void CScriptControlMacroDispatch:Test2()/ TODO: Add your dispatch handler code hereAfxMessageBox(CString(_T() + GetDispatchMap()-lpEntries1.lpszName + _T( methodcall of the ) + RUNTIME_CLASS(CScriptControlMacroDispatch)-m_lpszClassName+ _T( class), MB_ICONASTERISK);5、这样在产生的代码中已经实现了一些自定义的东西a. 不必要的声名和代码已经删除b. 全局的应用程序对象已经声名:extern CScriptControlMacroApp theAppc. MFC隐含函数声名已经添加:CString AFXAPI AfxStringFromCLSID( REFCLSID ).d. 为了使用AfxStringFromCLSID,IID_IScriptControlMacroDispatch定义已经移到了头文件中6、为了在所有MFC程序中方便地提供Unicode支持,在AFX.H头文件中作了如下定制: / Win32 libraries/ Start of customization#ifdef _UNICODE#pragma comment(linker, /entry:wWinMainCRTStartup)#endif/ End of customization7、为了在所

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论