Help and Support

文章编号: 168214 - 最后修改: 2004年8月5日 - 修订: 2.2

SAMPLE: MFCAxs.exe 实现使用 MFC 的活动脚本主机

本页

展开全部 | 关闭全部

概要

MFCAxs.exe 是一个示例,包含 MfcAxscrVb。 MfcAxscrVb 是一个说明的示例使用 MFC 编写的活动脚本宿主。 承载 VBScript DLL ; 但是,活动脚本机制通用任何活动的脚本引擎。 MfcAxscrVb 显示只有一个可能的种方式从主机实现宿主的活动脚本接口和与脚本引擎触发的事件连接的 Windows 邮件主机中提供调度对象。

MfcAxscrVb 包括 Visual C++5.0 工作区和项目文件。 虽然不提供任何 VC++ 4.2 兼容生成文件或 mdpfile MfcAxscrVb 的源代码将是使用 MFC 4.2b 兼容。

系统必备组件: COM 自动化

更多信息

从 Microsoft 下载中心下载下列文件有:
MFCAxs.exe (http://download.microsoft.com/download/vc50pro/mfcaxs/1/win98/en-us/mfcaxs.exe)
有关如何下载 Microsoft 支持文件单击下面的文章编号,以查看 Microsoft 知识库中的相应:
119591? (http://support.microsoft.com/kb/119591/EN-US/ ) 如何从联机服务获取 Microsoft 支持文件
Microsoft 扫描病毒此文件。 Microsoft 使用最新的病毒检测软件在发布该文件的日期中获得的。 该文件存储在安全性得到增强有助于防止任何未经授权的更改对文件的服务器上。

运行示例

当在运行 MfcAxscrVb 示例您将注意到应用程序的左上角中的一个较大的编辑控件。 您可以将粘贴或到此窗口的类型脚本,并选择"运行脚本"按钮以调用该脚本。 多个测试脚本将为您提供 script.txt 和 Testevents.txt 文件中。

公开主机: 分派对象

在本例中的主焦点是使用 MFC 的调度对象的实现。 为此原因是简单的。 如果没有任何脚本,脚本编写语言不多的使用。

核心技术的所有活动脚本依赖是大多数肯定的自动化。 实心知识的自动化在任何活动的脚本宿主的代码之前都是绝对必要的。 有几个很好的引用实现自动化: 章 14 和 15 的 Brockshmidt 的"内部 OLE,"第 11 章 Dale Rogerson"Inside COM,"和"OLE 自动化程序员参考"。

CCmdTargetPlus:

您需要,将是允许可编脚本的属性和通过 IDispatch 的方法,但还生成可编脚本的事件的一些对象。 MFC 确实会 grunt 工作的大部分为您实现 COM 对象的调度接口时。 但是,只支持传入的调度接口和传出的调度接口或事件接收器的 MFC 类是 COleControl。 COleControl 是得太 bulky 的有关内容。 只需一个调度接口的事件并键入信息。 VBScript 需要读取的支持事件调度对象的类型信息。 您可以在的动态创建此或创建静态类型库为您的主机调度对象并获取每个单个对象 ITypeInfo。

可能不必要 MfcAxscrVb 有一个基本的类,称为 CCmdTargetPlus 支持以下三个部分: 调度接口,使用控件的样式事件映射和 IProvideClassInfo 易于访问的类型信息的连接点。 大部分代码 CmdTargetPlus 中已添加到允许事件映射,添加事件的使派生类更加容易。

调度对象:

所有的主机提供调度对象是使用 CCmdTargetPlus 实现的。 没有它们需要执行正常的一些事项。 任何调度对象 (CAButtonDispatch、 CBButtonDispatch,等) 的请参阅在所需的样板。 MfcAxscrvb 的对象模型的简短摘要列在此文档的末尾。

如果用户在中添加您自己的对象一定要仔细检查三个唯一的 GUID 的主调度和主要事件的接口以及对象和中 Clsid。 这需要实现文件和.odl 文件完成。 (剪切和粘贴此帮助)。 剪切并粘贴所有这些类向导宏,然后将其更改为新的类名称。 类向导是非常特定,但如果您按照一切只是右在.odl、 h 和.cpp 文件,您可以使用它添加新事件,属性,和方法以在调度对象视为一个 MFC OLE 控件。 这非常的方便。

MfcAxscrVb 保留实现调度机制独立于 MFC 对象实际上引用到该对象。 是例如,该对话框有称为该"AButton,"这是可编脚本的一个按钮。 MFC 按钮对象为 CButton。 CCmdTargetPlus 派生类,CAButtonDispatch,是独立且不同。 这是一个关键点。 只是主机程序员显式选择基本的 MFC 对象和 Windows 控件公开将是可编脚本。

CEventsButton,CEventsEdit,CeventsListBox:

对于事件,有需要是一些代码,响应 Windows 事件例如按钮单击),并生成的事件脚本引擎。 (记住事件是一个调度调用接口由宿主对象中的连接点上)。 本示例将完成此标准 MFC 消息处理程序添加到从各种类派生的对象。 每个这些处理程序只有 (经的代码添加到 CCmdTargetPlus) 调用调度对象上的 FireEvent。 所有其他自动发生。

因为调度对象和实际的 MFC Window 对象是在此示例中的单独,对话框父需要显式挂钩两个一起。 这样 Mfcaxscrvbdlg 构造函数中。

已命名的项目

后调度对象必须设置它们,以便脚本引擎知道它们。 脚本引擎所知道的所有命名的调度对象的集合被称为命名该"脚本空间"。 通过 IActiveScript::AddNamedItem 方法,项目将添加到脚本命名空间。 如我上文很实现对象的 IDispatch,并对象中支持通过 ITypeInfo 的类型信息的主机的税。 脚本引擎需要解析对已命名项目引用时, 请求的 IUnknown 指针它主要是查询 IDispatch) 和一个 ITypeInfo 指针使用 IActiveScriptSite::GetItemInfo 方法。

不是主机要是可编脚本的全部需要一个已命名的项目。 通常,主机将有其中 Sub-objects 是通过一个更高级别对象访问的对象的层次结构。 常见的比喻是应用程序 > 项目层次结构的文档对象是从顶级的 Application 对象访问为应用程序对象本身的 IDispatch 属性的文档。 相同的方式 Document 对象本身公开多个 Sub-objects,并且每个是可以通过一个项目数组或其他 contrivance 获取的一个项。

使用此方案,脚本引擎是智能导航到一个 Sub-item,在脚本代码显示以下消息而无需文档或项目添加到该脚本命名空间:
Set Obj = Application.Document.Item(1)
				
只要作为其父对象获取属性公开此子,脚本引擎找到其成功。 有趣的是,脚本引擎就能够"假定顶级层次结构中的项目。 这意味着是如果应用程序声明为顶级项目,然后它是足以说以下以前的脚本代码:
Set Obj = Document.Item(1)
				
这正是如何 Internet Explorer 3.0 允许您向 Window 对象的上下文中的脚本代码而不总是前缀对具有"窗口"对象的所有引用。 脚本主机需要通过使用 SCRIPTITEM_GLOBALMEMBERS 标志确定在调用 AddNamedItems 顶级的脚本项目。 内容通常不清除的活动脚本文档但是,只有名为项目的可支持事件。 如果使用上面的示例,则没有语法来说以下操作来处理特定项目中的事件:
   Sub Application.Document.Item(1)_OnEvent ' this doesn't work!
				
因此,对于 MfcAxscrvbdlg,因为我们希望能够处理在层次结构中, 每个对象的事件每个对象添加为一个已命名项目。 每个对象也通过对象可访问该顶级脚本专家 (该对话框本身),它当前不支持事件。

WebBrowser 控件:

在此示例,脚本主机公开到脚本命名空间只有一个外部的对象。 这是由 MFC 的默认控件包含支持在对话框在 WebBrowser 控件。 您需要是一个 AddRef 会发送指向该的控件和您设置。 对于事件,外部对象需要以某种方式公开的 ITypeInfo 指针。 MfcAxscrVb 通过 IProvideClassInfo::GetClassInfo 获取此操作。 作为最后的办法主机未能读取对象的类型的信息自身公开的 ITypeInfo。 幸运的是,WebBrowser 控件的支持是 GetClassInfo,以便 MfcAxscrVb 不执行此。

如果您要将其他外部自动化对象添加到命名空间时,通常是必需的是获得使用 CoCreateInstance IUnknown 接口。 或者,主机可支持泛型方法获得外部的对象的但那些不需要有处理的事件。 在 Visual Basic CreateObject 调用为此,函数。

获取其他应用程序: HostCreateObject

之外的用于公开的所有子对象的属性集,主脚本专家对象 (对话框类本身),请公开只有一个特殊的方法。 此方法演示一个简单意味着模拟 VB 的 CreateObject 函数。 请注意,方法为 HostCreateObject 来突出这种方法不,脚本引擎免费提供,但该主机必须实现它本身。 有些主机清楚地将不希望出于安全原因提供此功能,IE3 是一个主要的示例。 HostCreateObject 的主要目标是对象的返回请求的调度指针。 一旦脚本引擎有调度指针,它知道如何从那里。

注意 : 另存为 2.0 版的 VBScript 和 JScript 引擎现在支持为内置函数的 CreateObject。 主机不需要实现此功能。 此函数将但是,测试要确保它是可安全编写脚本允许要使用的对象之前的对象。 对象是本身支持 IObjectSafety 接口或标记适当的组件类别注册表项的安全脚本编写脚本的安全。 请参阅到 Microsoft 知识库有关详细信息。

类向导支持

诡计 MfcAxscrVb 中在最后一小段是对支持类向导所做的操作。 类向导,从技术角度来说不是"哑。 它是只 mentally 质询。 是什么它,但请记住它只是盲目地搜索查找这些特殊的 ClassWizard 注释的文件非常方便。 如果您为 COleControl 按照格式,可以几乎获取立即使用类向导的自动化和事件选项卡。

一个问题是 MfcAxscrVb 某些其对象层次结构中使用派生。 所有按钮对象派生自一个公共的 CButtonDispatch 对象公开属性和所有这些它会分别支持的方法。 但是,涉及时间来填充该.odl 文件时各个对象需要包含的所有属性和父类的方法。 不必说这会将时间数字,DISPID 时混淆类向导。 如果您使用类向导,请确保您仔细检查在两个位置生成的 DISPID:.odl 文件以实现自动化类和在类定义枚举。 使用派生的按钮类时很容易看到相同的 DISPID 分配给多个属性和方法。 更易于更正该的 DISPID 但,比要添加的所有内容的草稿,因此功能已被保留在 MfcAxscrVb。

随着 Visual C++5.0 的改进支持的 IDL 方法和属性通过 ClassView 的设置是否 ClassWizard 需要或不的 toss。 但 MfcAxscrVb 现在支持它。 欣赏。

附录 A: 对象模型

scripter:

这是从中派生所有其他对象是在主对象。 它在.odl 文件中的"IMfcaxscrvbDlg"但添加为已命名项目"脚本专家。 它有一个方法,的上面描述的 HostCreateObject。

按钮对象:

AButton BButton,CancelButton,OKButton RunScript

属性
  • 按钮图标标题: 文本。
方法 按: 可像已推送到按钮。
  • 按: 可像已推送到按钮。
事件
  • 时推送到按钮,将触发 OnClick:。
  • 时鼠标滚动按钮上,将触发 onmouseover:。
  • 给定焦点时,处理激发 OnFocus(bSet): 或者从按钮。
BroCon:

BroCon 是 WebBrowser 控件在对话框的名称。 它支持所有属性和方法为 WebBrowser 控件在 Internet Client SDK / ActiveX SDK 中。

EditCon:

方法
  • AppendLine(strToAdd): 添加 strToAdd 结束的编辑文字窗口。
  • InsertLine (strToAdd、 nWhere): 在行 #nWhere 添加 strToAdd。
  • RemoveLine(nWhere): 删除行 # nWhere 从编辑窗口。
事件
  • 时鼠标滚动窗口上,将触发 onmouseover:。
  • 字符 strChar 输入窗口时,处理激发 OnChar(strChar):。
  • 给定焦点时,处理激发 OnFocus(bSet): 或者从按钮。
Lbox:

方法
  • AddString(strIn): 将 StrIn 添加到列表框中。
  • ClearList: 清除列表框中的所有字符串。
  • RemoveString(strRemove): 删除 StrRemove 的第一个实例并将其从列表框中移除。
  • SelectString(strSelect): 选择由 strSelect 指定字符串。
事件
  • 时鼠标滚动窗口上,将触发 onmouseover:。
  • 给定焦点时,处理激发 OnFocus(bSet): 或者从按钮。
  • OnSelCancel(strCancelled): 时所选内容将被取消在列表框元素 strCancelled。
  • OnSelChange(strChange): 当列表框元素 strChange 是用户选定的。

这篇文章中的信息适用于:
  • Microsoft Internet Explorer 3.01
  • Microsoft Internet Explorer 3.02
  • Microsoft Internet Explorer 4.0 128-Bit Edition
  • Microsoft Internet Explorer 4.01 Service Pack 2
  • Visual Basic,Scripting Edition 1.0
  • Microsoft Visual Basic, Scripting Edition 1.1
  • Visual Basic,Scripting Edition 2.0
  • Microsoft Foundation Class Library 4.2?当用于
    • Microsoft Visual C++ 5.0 企业版
    • Microsoft Visual C++ 5.0 专业版
关键字:?
kbmt kbdownload kbfile kbinfo kbsample KB168214 KbMtzh
机器翻译机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。如果您发现了错误并希望帮助我们提高机器翻译技术,请完成文章末尾的在线调查。
点击这里察看该文章的英文版: 168214? (http://support.microsoft.com/kb/168214/en-us/ )
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。
Retired KB Article不再更新的 KB 内容免责声明
本文介绍那些 Microsoft 不再提供支持的产品。因此本文按“原样”提供,并且不再更新。

文章翻译

 

Related Support Centers