精品学习资料---收集网络如有侵权请联系网
站删除
C O M 自 动 化 第 一 部 分--------------------------------------------------------------
------------------
在这部分和以后的内容中我们将深入COM自动化世界。希望用一个简要的专栏来研究这个题目。我们将谈论怎样进行自动化IDisp atch调用和处理自动化对象需要做什么。然后我们将讨论用于自动化的特殊COM数据类型和研究双重接口。
自动化从前叫做OLE 自动化是一个和迄今为止我们曾认为标准COMvtable接口完全不同的客户调用服务器方法。
自动化是使用标准C OM接口IDisp atch来存取对象的自动化接口。 因此 我们说任何实现ID isp atch的对象实现了自动化。
精品学习资料---收集网络如有侵权请联系网
站删除
精品学习资料---收集网络如有侵权请联系网
站删除
为什么要自动化
最初开发自动化是作为一种应用程序(例如Word和Excel)用以把其功能显露给其他应用,包括脚本语言的方式。 目的是提供一种简单方式来访问属性和调用方法这种方式尽可能少的占用自动化客户的资源并且不需要被访问对象的类型信息就可以进行调用的方法。
在C++头文件中描绘接口的类型信息决不是浪费时间描绘方法的vtable偏移量也很重要最困难的是设置正确的C++堆栈框架以便正确的执行方法调用。对一个基于文本的解释语言所有这些尤其需要技巧。
如果每个脚本语言都不得不做这个机灵的程序那么很少有能存取COM对象的了。使用自动化对象就可以提供一个简单的自动化接口这样脚本语言作者只需掌握IDisp atch和几个COM应用程序接口就可以了。
精品学习资料---收集网络如有侵权请联系网
站删除
精品学习资料---收集网络如有侵权请联系网
站删除
VisualBasic的第一个32位版使用自动化存取OLE控件现在叫Active X控件他代替了16位的VisualBasic的VBX控件。VisualBasic仍然可以使用自动化存取一个控件的属性和方法但是更近的版本也支持使用标准COMvtab le接口。这次我们创建的例子将使用自动化接口。
脚本语言 例如VisualBasicforApplications、VB S cript和J/S cript 以独占模式使用自动化。所以如果你想要你的对象可以被脚本语言使用你必须实现一个自动化接口。
对象和属性和方法噢我的上帝
世界上关于自动化有三个主要概念。对象是最重要的概念。对象显露属性和方法。
图1.自动化对象的属性和方法
把这个与更复杂的世界的COM观点对比在这种观点中是接口而不是对象是第一位的精品学习资料---收集网络如有侵权请联系网
站删除
精品学习资料---收集网络如有侵权请联系网
站删除
而属性是不存在的并且每个对象能有多个包含多个方法的接口。
图2.COM对象接口方法包括没有标签的IUnknown
方法与C++成员函数相似而自动化的属性则与C++数据成员和实例数据也叫属性相似。注意接口没有独立的概念每个对象有一个自动化接口。进一步注意到COM接口没有属性的概念它们只有方法。 但是我们可以使用ge t/s et方法对模拟属性。
自动化对象怎样被创建
创建一个自动化对象是一个简单的操作。这儿我将使用VisualBasic作为例子但是在任何兼容自动化的语言中方法基本上一样。
在VisualBasic你应先创建一个对象变量DimBeeperasObject
精品学习资料---收集网络如有侵权请联系网
站删除
精品学习资料---收集网络如有侵权请联系网
站删除
……接着设置它指向一个特殊的对象
SetBeeper=CreateObject("BeepCntMod.BeepCnt")在这个例子中我们创建了一个B e ep Cnt对象见第一篇ATL文章,这篇文章将会在以后刊出-译者注。
我们可以接着调用对象上的方法控制它的属性就像我们不久将看到的。
但是首先让我们讨论VisualBasic 或者任何自动化客户程序在幕后真正做什么。
我们早已知道我们将通过IDi sp atch C OM接口访问自动化对象。所以D IM语句只显示集合至少需要的内存因此VisualBasic能为我们即将创建的对象访问IDisp atch指针。
Cre ate Obj e ct调用需要有一点技巧。首先GUID在哪里对象的C L S ID没有GUID我们怎样创建它
精品学习资料---收集网络如有侵权请联系网
站删除
精品学习资料---收集网络如有侵权请联系网
站删除
你可以重新调用这样我们可以通过对象的ProgID引用对象类型。你也可以重新调用我们在注册表用ProgID作为键名注册的一个键。该键用一个C L S ID作为子键。
COM提供一个叫CLSIDFromProgID的函数它根据给出的ProgID查找CLSID。VisualBasic用我们传送到CreateObj ect的字符串调用这个函数。 在这个例子中 VisualBasic将传送"BeepCntMod.BeepCnt"。CLSIDFromProgID查阅那个键和返回与它相关的C L S ID。 顺便说一句ProgID的第一部分是模块或应用程序名第二部分是模块或应用程序中的对象名。
在这一点上VisualBasic调用我们的老朋友Co CreateInstanceEx 传送 CLS ID和请求IDispatch接口。如果CoCreateInstanceEx成功VB创建一个包含由CoCreateInstanceEx收到的ID isp atch指针的对象变量并且把它分配给我们精品学习资料---收集网络如有侵权请联系网
站删除
精品学习资料---收集网络如有侵权请联系网
站删除
的对象变量。
如果因任何原因创建失败对象不存在或者它没实现IDisp atch则对CreateObj ect的调用失败。就像你所看到的 VisualBasic 或任何自动化客户的开销是最小的所有必须知道的是用两个简单的COM函数创建对象。
那么你怎样访问自动化属性和方法
访问我们的对象的VisualBasic源代码可能像下面这样
BC=Beeper.Count
Beeper.Count=5
Beeper.Beep
这三个语句分别访问一个属性、设置一个属性和调用一个方法都只使用了两种ID i sp at ch方法GetIDsO fName s 和 Invoke 。精品学习资料---收集网络如有侵权请联系网
站删除
精品学习资料---收集网络如有侵权请联系网
站删除
IDispatch: :GetID sO fNames获得与方法或属性的文本名有关的整型ID。VisualB asic调用它发现"Beep 嘟嘟响 "对应ID 1和"Count 计数 "对应ID 2。当我们调用ID i sp at ch: :In vo ke时我们需要这些叫做disp id s的ID。
所有现行的自动化属性和方法访问都是通过调用IDisp atch: :In voke实现。换句话说你的自动化客户要访问自动化对象所必须知道是几个简单的COM调用。如果你的执行语言不是C或C++你可以为你的运行时间编写帮助者来做那些调用所以从任何程序使用自动化是简单的。也许很简单但并不是不重要 ID i sp at ch: :In vo ke接收一批参数所有的参数必须被正确设置。最重要的是
一个叫disp id的整型ID它指定要被访问的属性和方法我们通过调用包含属性或方法名的字符精品学习资料---收集网络如有侵权请联系网
站删除
精品学习资料---收集网络如有侵权请联系网
站删除
串的GetIDsOfName s获得它。
一个包含一列参数指针的结构。 每个参数被存储到包含一个典型标记和一个叫vari an t的共用体的结构中。
一个包含指向属性设置它、获得它、用一个引用设置它或者方法调用它数列的指针的结构。
一个作为属性获取的或者是方法调用返回的返回值参数也是一个变量。
噢万一你想本地化方法、属性、名字化参数名或参数值 Invoke和GetIDsO fName s都接受一个本地ID。
In vo ke也有几个其他参数可以把错误信息传递给自动化客户。在这里我们将假定我们处在一个完美的世界暂时不考虑它们。
变量Vari ant以16个字节存储。前两个字节是一个标记包含一个代表变量类型的数其次的六个字节填满最后的八个字节是变量的值。精品学习资料---收集网络如有侵权请联系网
站删除
目前舍利云服务器的主要特色是适合seo和建站,性价比方面非常不错,舍利云的产品以BGP线路速度优质稳定而著称,对于产品的线路和带宽有着极其严格的讲究,这主要表现在其对母鸡的超售有严格的管控,与此同时舍利云也尽心尽力为用户提供完美服务。目前,香港cn2云服务器,5M/10M带宽,价格低至30元/月,可试用1天;;美国cera云服务器,原生ip,低至28元/月起。一、香港CN2云服务器香港CN2精品线...
BGP.TO目前针对日本和新加坡服务器进行促销,其中日本东京服务器6.5折,而新加坡服务器7.5折起。这是一家专门的独立服务器租售网站,提供包括中国香港、日本、新加坡和洛杉矶的服务器租用业务,基本上都是自有硬件、IP资源等,国内优化直连线路,机器自动化部署上架,并提供产品的基本管理功能(自助开关机重启重装等)。新加坡服务器 $93.75/月CPU:E3-1230v3内存:16GB硬盘:480GB ...
部落分享过多次G-core(gcorelabs)的产品及评测信息,以VPS主机为主,距离上一次分享商家的独立服务器还在2年多前,本月初商家针对迈阿密机房限定E5-2623v4 CPU的独立服务器推出75折优惠码,活动将在9月30日到期,这里再分享下。G-core(gcorelabs)是一家总部位于卢森堡的国外主机商,主要提供基于KVM架构的VPS主机和独立服务器租用等,数据中心包括俄罗斯、美国、日...