1. 1、本文档共13页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
COM自动化

COM自动化,第一部分 -------------------------------------------------------------------------------- 在这部分和以后的内容中,我们将深入COM 自动化世界。希望用一个简要的专栏来研究这个题目。我们将谈论怎样进行自动化(IDispatch)调用和处理自动化对象需要做什么。然后,我们将讨论用于自动化的特殊COM数据类型和研究双重接口。 自动化(从前叫做OLE自动化)是一个和迄今为止我们曾认为标准COM vtable接口完全不同的客户调用服务器方法。 自动化是使用标准COM接口IDispatch来存取对象的自动化接口。因此,我们说任何实现IDispatch的对象实现了自动化。 为什么要自动化? 最初开发自动化是作为一种应用程序(例如Word和Excel)用以把其功能显露给其他应用,包括脚本语言的方式。目的是提供一种简单方式来访问属性和调用方法,这种方式尽可能少的占用自动化客户的资源,并且不需要被访问对象的类型信息就可以进行调用的方法。 在C++头文件中描绘接口的类型信息决不是浪费时间,描绘方法的vtable偏移量也很重要,最困难的是,设置正确的C++堆栈框架以便正确的执行方法调用。对一个基于文本的解释语言所有这些尤其需要技巧。 如果每个脚本语言都不得不做这个机灵的程序,那么很少有能存取COM对象的了。使用自动化,对象就可以提供一个简单的自动化接口,这样脚本语言作者只需掌握IDispatch和几个COM应用程序接口就可以了。 Visual Basic的第一个32位版使用自动化存取OLE控件(现在叫ActiveX控件),他代替了16位的Visual Basic的VBX控件。Visual Basic仍然可以使用自动化存取一个控件的属性和方法,但是更近的版本也支持使用标准COM vtable接口。这次我们创建的例子将使用自动化接口。 脚本语言,例如Visual Basic for Applications、VBScript和J/Script,以独占模式使用自动化。所以如果你想要你的对象可以被脚本语言使用,你必须实现一个自动化接口。 对象和属性和方法,噢,我的上帝! 世界上关于自动化有三个主要概念。对象是最重要的概念。对象显露属性和方法。 图1. 自动化对象的属性和方法 把这个与更复杂的世界的COM观点对比,在这种观点中,是接口,而不是对象,是第一位的,而属性是不存在的,并且每个对象能有多个包含多个方法的接口。 图2. COM对象,接口,方法(包括没有标签的IUnknown) 方法与C++成员函数相似,而自动化的属性则与C++数据成员和实例数据(也叫属性)相似。注意接口没有独立的概念,每个对象有一个自动化接口。进一步注意到COM接口没有属性的概念,它们只有方法。(但是我们可以使用get/set方法对模拟属性。) 自动化对象怎样被创建? 创建一个自动化对象是一个简单的操作。这儿我将使用Visual Basic作为例子,但是在任何兼容自动化的语言中,方法基本上一样。 在Visual Basic,你应先创建一个对象变量: Dim Beeper as Object ……接着设置它指向一个特殊的对象: Set Beeper = CreateObject(BeepCntMod.BeepCnt) 在这个例子中我们创建了一个BeepCnt对象(见 第一篇ATL文章,这篇文章将会在以后刊出-译者注)。 我们可以接着调用对象上的方法控制它的属性,就像我们不久将看到的。 但是首先,让我们讨论Visual Basic(或者任何自动化客户程序)在幕后真正做什么。 我们早已知道我们将通过IDispatch COM接口访问自动化对象。所以DIM语句只显示集合至少需要的内存,因此Visual Basic能为我们即将创建的对象访问IDispatch指针。 CreateObject调用需要有一点技巧。首先,GUID在哪里?对象的CLSID没有GUID我们怎样创建它? 你可以重新调用,这样我们可以通过对象的ProgID引用对象类型。你也可以重新调用我们在注册表用ProgID作为键名注册的一个键。该键用一个CLSID作为子键。 COM提供一个叫CLSIDFromProgID的函数,它根据给出的ProgID查找CLSID。Visual Basic用我们传送到CreateObject的字符串调用这个函数。在这个例子中,Visual Basic将传送BeepCntMod.BeepCnt。CLSIDFromProgID查阅那个键和返回与它相关的CLSID。(顺便说一句,ProgID的第一部分是模块或应用程序名,第二部分是模块或应用程序中的对象名。)

文档评论(0)

f8r9t5c + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8000054077000003

1亿VIP精品文档

相关文档