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

文章翻译 文章翻译
文章编号: 168214 - 查看本文应用于的产品
展开全部 | 关闭全部

本文内容

概要

MFCAxs.exe 是包含 MfcAxscrVb 示例。MfcAxscrVb 是使用 MFC 编写一个指导性示例活动脚本主机。它为宿主 VBScript DLL ; 但是,活动脚本机制是泛型到任何活动脚本引擎的。MfcAxscrVb 显示以提供从主机实现主机的活动脚本的接口和连接在主机中的窗口消息的脚本引擎激发的事件的调度对象只是一种可能的方式。

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

系统必备组件: COM 自动化

更多信息

以下文件是可从 Microsoft 下载中心下载:
MFCAxs.exe
有关如何下载 Microsoft 支持文件的其他信息请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
119591如何从联机服务获得 Microsoft 支持文件
Microsoft 扫描此文件的病毒。Microsoft 使用该文件已过帐的日期上获得的最新病毒检测软件。该文件存储在安全性得到增强的服务器,这有助于防止未经授权的情况下对其进行更改文件上。

运行示例

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

公开主机: 配送对象

对于本示例将主焦点是使用 MFC 的调度对象的实现。原因很简单。如果没有进行任何脚本,一种脚本语言不是很多使用。

核心技术,该技术在其所有活动脚本取决于为大多数肯定的自动化。尝试编写代码的任何活动脚本主机之前,实体的工作知识的自动化是绝对必要的。 有几个很好的引用自动化: 章节 14 和 15 的 Brockshmidt 的"内部 OLE,"一章 11 Dale Rogerson"内部 COM,"和"OLE 自动化程序员参考。

CCmdTargetPlus:

您需要的是允许使用可脚本化的属性,并通过 IDispatch 的方法,但还生成可脚本化的事件的一些对象。MFC 肯定为您完成大部分 grunt 工作实现 COM 对象的调度接口时。但是,只支持传入的调度接口和传出的调度接口或事件接收器的 MFC 类是 COleControl。COleControl 是得太繁多以便在您的需要。您只需一个的调度接口的事件,并键入信息。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 窗口对象都是在此示例中单独,对话框父需要显式挂钩这两个一起。这是 Mfcaxscrvbdlg 构造函数。

已命名的项目

在您有了调度对象后必须对它们进行设置,使脚本引擎知道它们。脚本引擎知道的所有命名的调度对象所组成的集合称为命名"脚本空间"。项目是通过 IActiveScript::AddNamedItem 方法添加到脚本名称空间中。如我上文是实施一个 IDispatch 的对象和对象的支持类型的信息通过 ITypeInfo 的主机的税种。当脚本引擎要在解析对已命名项目的引用时它将使用请求一个 IUnknown 指针 (它会查询主要用于 IDispatch) 和一个 ITypeInfo 指针 IActiveScriptSite::GetItemInfo 方法。

不所有主机的目标是可脚本化需要已命名的项目。 通常 $ 主机需要其中子是通过较高级别对象可访问的对象的层次结构。常见的隐喻是应用程序->-> Document 对象其中作为应用程序对象本身的 IDispatch 属性是可从顶级的 Application 对象访问的项目层次结构的文档。以相同的方式本身的 Document 对象公开若干子和每个都是您可以通过项的数组,或者其他 contrivance 获取的项。

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

web 浏览器控件:

在此的示例脚本宿主公开到脚本名称空间只能有一个外部对象。这是由 MFC 的默认控件包容支持承载在对话框上的 web 浏览器控件。您只需要是一个 AddRef 想发送于在控件的指针和您正在设置。事件,外部对象需要以某种方式公开一个 ITypeInfo 指针。MfcAxscrVb 获取这 IProvideClassInfo::GetClassInfo。作为最后的手段主机可以读取该对象的类型的信息本身公开一个 ITypeInfo。 幸运的是,web 浏览器控件支持 GetClassInfo,因此 MfcAxscrVb 不会执行此操作。

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

获取到其他应用程序: HostCreateObject

而不用于公开的所有子对象的属性套主要脚本编写者对象 (对话框类本身) 公开只有一个特殊的方法。此方法演示一个简单意味着用于模拟 VB 的 CreateObject 函数。请注意该方法被命名为 HostCreateObject 强调此方法不由脚本引擎免费提供,但在主机必须实现它本身。某些主机显然不希望由于安全原因提供这种能力,IE3 是一个主要示例。HostCreateObject 的主要目标是对象的要返回所请求的调度指针。一旦脚本引擎已调度指针,它知道如何从那里。

: 为 2.0 版的 VBScript 和 JScript 引擎现在都支持 CreateObject 作为内置函数。若要实现此功能不需要该主机。此函数将但是,测试以确保它是可安全执行脚本之前允许用于对象的对象。对象认为自己通过支持 IObjectSafety 接口或 $ 将适当的组件类别注册表项标记为安全的脚本编写脚本的安全。要在 Microsoft 知识库的详细信息,请参阅。

类向导支持

诡计 MfcAxscrVb 中的最后一个很少的位是对支持类向导进行该操作。类向导,从技术上讲不是"哑。它是只需 mentally 难题。它是对它不会但请记住它只是盲目地搜索寻找这些特殊的类向导注释的文件非常方便。如果您遵循 COleControl 格式,您可以只是有关 get 即可使用类向导的自动化和事件标签。

一个 complication 是 MfcAxscrVb 一些其对象层次结构中使用派生。所有按钮对象出自一个常见 CButtonDispatch 对象,该对象公开属性和所有这些它将分别支持的方法。但是,它时时间填写.odl 文件需要包含的所有属性和方法的父类别的每个对象。不用说这将编号在 dispid 时将类向导相混淆。如果您使用类向导,请确保仔细检查的两个位置生成的 dispid: 自动化类和类定义内的枚举.odl 文件。使用派生的按钮类别时, 很方便地查看分配给多个属性和方法的相同 DISPID。则要容易得多更正 dispid,但,比若要添加的所有内容由零开始,因此功能已被保留在 MfcAxscrVb。

与 Visual c + + 5.0 的改进支持的 IDL 方法和属性通过 ClassView 的最多类向导是否需要或者不是丢掉。但 MfcAxscrVb 现在都支持它。享受。

附录 a: 对象模型

脚本专家:

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

按钮对象:

AButton BButton CancelButton,OKButton RunScript

属性
  • 标题: 文本的按钮图符。
方法 按: 作用就好像按该按钮。
  • 按: 作用就好像按该按钮。
事件
  • 当按下按钮时,将触发 OnClick:。
  • 当鼠标指针悬停按钮上滚动时,将触发 OnMouseOver:。
  • OnFocus(bSet): 激发时给出焦点或来自按钮。
BroCon:

BroCon 是 web 浏览器控件对话框上的名称。它支持所有属性和方法的 web 浏览器控件的 Internet 客户端 SDK/activex SDK 中所述。

EditCon:

方法
  • AppendLine(strToAdd): 添加 strToAdd 结束的文本编辑窗口。
  • InsertLine (strToAdd、 nWhere): 在行 #nWhere 添加 strToAdd。
  • RemoveLine(nWhere): 从编辑窗口中移除行 # nWhere。
事件
  • 当鼠标滚动窗口上时,将触发 OnMouseOver:。
  • OnChar(strChar): 触发字符 strChar 输入到窗口时。
  • OnFocus(bSet): 激发时给出焦点或来自按钮。
Lbox:

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

属性

文章编号: 168214 - 最后修改: 2004年8月5日 - 修订: 2.2
这篇文章中的信息适用于:
  • 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
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。
不再更新的 KB 内容免责声明
本文介绍那些 Microsoft 不再提供支持的产品。因此本文按“原样”提供,并且不再更新。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com