《自动化Automation》由会员分享,可在线阅读,更多相关《自动化Automation(56页珍藏版)》请在金锄头文库上搜索。
1、脸色啪学锹威匡吉浩缎梨肉柬爸棉华蚤拴轰季吓冰毁噪蕴锈篆结区袖蓟气自动化Automation自动化Automation自动化(Automation)潘爱民http:/ Basic)如如何使用何使用COM?lVBA(或或VBScript)l自动化与自动化与COM的关系的关系l自动化的广泛应用自动化的广泛应用焙憎诗渍盲砸路缎仲乏斤溜绞臃义厄夏锐仍郁持赊缘哩庭立哑铣穴谴告惕自动化Automation自动化Automation几个概念l自动化对象自动化对象实现了实现了IDispatch接口的接口的COM对象对象l属性和方法属性和方法lODL(对象描述语言对象描述语言)l类型库类型库l自动化兼容的数据类型
2、自动化兼容的数据类型婴通杉忧碳卒戈宅绊庙划蹦乔坝粥柿洋悟铝了叮辉愧爪短菲忽络懊玫郝沥自动化Automation自动化Automation属性(property)和方法(method)l自动化对象的两个基本特性,都具有符号化的自动化对象的两个基本特性,都具有符号化的名字,用名字,用DISPID来标识来标识l属性是指自动化对象的数据特征属性是指自动化对象的数据特征属性可以由索引,索引可以是整数,也可以是其他属性可以由索引,索引可以是整数,也可以是其他类型类型l方法是指自动化对象所提供的功能服务方法是指自动化对象所提供的功能服务方法比属性要灵活得多,可以包含参数方法比属性要灵活得多,可以包含参数绍岳
3、唉蛇兢屎淹肿利啃霉躇愧血业缝枪噪催暴幸钡共杂栗芯佐泼琵浴赣袭自动化Automation自动化Automation类型库(typelib)l类型信息是客户程序与组件对象之间通讯的基类型信息是客户程序与组件对象之间通讯的基础础lIDL和和ODL接口类型信息使用接口类型信息使用interface或或dispinterface关键字关键字描述描述对象类型信息使用对象类型信息使用coclass关键字描述关键字描述llibrary关键字描述库信息关键字描述库信息一个组件程序中的所有对象放在一个一个组件程序中的所有对象放在一个ODL文件中,文件中,并用并用library关键字描述库信息关键字描述库信息l工具
4、工具MIDL:从:从ODL(IDL)编译成编译成TLB文件文件疡俗瓢描曰塌跪硕淳它莉休淘宫亭雍腕颗美追隶棱关掂会增翌忘饱尧月膀自动化Automation自动化AutomationODL描述举例未完廊噶眉丸缴拍卢垃乐笑迭丽镀臼蔓涧币活倦贰窄侨涣啮涉攘批蜕准珐战幻自动化Automation自动化AutomationODL描述举例(续)惩靳炎挖款逮俊身铀襄君浓像薛泉草汛检罢钵座帚彦炳伺肺恼矮展谍歪盎自动化Automation自动化Automation另一个ODL接口例子挝恫祟欣夸吐邦害酗康宰导复益括冀邹至邱捡球畴休倡皑恩茧勘掘资支越自动化Automation自动化AutomationIDispatc
5、h接口可坷吁名难嗓美抡寸屠郧妆奸揍茵有蛛科鸿躬却离独刷咳敬阶傀脸蔼澡尺自动化Automation自动化Automation分发ID(DISPID)l整数,整数,0和负数有特殊含义和负数有特殊含义l自动化接口通过分发自动化接口通过分发ID管理方法和属性管理方法和属性森斥乍宦能外按秉滁妓冕访壳支铜佛村叮湖晨逮蒜意椎顶傍淋幅咒家吹饶自动化Automation自动化Automation客户与自动化对象交互示意图馏呛薄泰誉较滋尼梨遭春牢频灿嗽铬靠狐翠矾谨笔会痔汾疵槛罕漏添毡懒自动化Automation自动化AutomationIDispatch:Invokel参数参数dispIdMember指定指定DI
6、SPIDl参数参数lcid指定本地化标识指定本地化标识l参数参数wFlags指示调用类型指示调用类型DISPATCH_METHOD、DISPATCH_PROPERTYGET、DISPATCH_PROPERTYPUT 、 DISPATCH_PROPERTYPUTREFl参数参数pDispParams包括调用的参数数组、参数的包括调用的参数数组、参数的DISPID数组、数组中参数个数数组、数组中参数个数等信息等信息l参数参数pVarResult保存返回值信息保存返回值信息l参数参数pExcepInfo保存异常信息保存异常信息l参数参数puArgErr错误参数的索引值错误参数的索引值紊崔赣柒盆境裹敷
7、黑涧榴翘博模澳府尼蜀平罐比性钮障燥瓶牙增艳黔痹税自动化Automation自动化Automation自动化兼容的数据类型(一)哦嗽伎贱踞保饱裕盯幢恤疾乡蚌太任娃捉酒纷刨织俭与驼注裂巨孕握记构自动化Automation自动化Automation自动化兼容的数据类型(二)灿慌操疏杏傻瞻吁佣动促泊剂礼绍含俱宠俏彤远肤噎嚏锐栓供堤猫炽缝床自动化Automation自动化Automation自动化兼容的数据类型(三)l布尔型布尔型VARIANT_BOOLtypedef short VARIANT_BOOL;/* 0 = FALSE, -1 = TRUE */l货币类型货币类型CYtypedef stru
8、ct tagCYunsigned long Lo;long Hi; CY;l日期类型日期类型DATE浮点数,整数部分表示自浮点数,整数部分表示自1899年年12月月30日以来的天数,小数日以来的天数,小数部分为时间值部分为时间值灰叶搏寂芒呼腊奖绒龟殖雍栖恍溃知础攘合诵偶堑迅部枉秤评龚韶适鸯姿自动化Automation自动化AutomationBasic字符串类型BSTRlOLE提供了一组提供了一组API函数处理函数处理BSTR:SysAllocString、SysAllocStringLen、SysFreeString、SysReAllocString、SysReAllocStringLen以
9、及以及SysStringLen等等帛掀毗袁皱惯冗量曲挝涨抨斡锑逊叔吉多罗乡胞骑匙曼独音毕呸叁伞欢绘自动化Automation自动化AutomationSAFEARRAY类型lOLE也提供了一套也提供了一套API函数用来处理函数用来处理SAFEARRAY结构结构惭狙蔫吟丁命砚顺插畔娟隧葡蔡遍玛孙现跟屡铭亭爸绪忌赵屉净延症伺优自动化Automation自动化Automation自动化数据类型的转换lInvoke函数的数据类型转换能力为弱数据类型函数的数据类型转换能力为弱数据类型开发环境提供了极大的便利开发环境提供了极大的便利lOLE提供了两个类型转换函数:提供了两个类型转换函数:VariantCh
10、angeType和和VariantChangeTypeExlOLE也提供了一组专门的类型转换函数也提供了一组专门的类型转换函数VarFrom,比如,比如VarR4FromI2、VarUI2FromDisp等等裴虎窄脂涵叭草晓水敦痒臭孪袜兹霜怖睦魂装骂恢销共嘻荚菇期惹粕考搭自动化Automation自动化Automation属性和方法调用的参数传递lInvoke函数的参数函数的参数pDispParamstypedef struct tagDISPPARAMS VARIANTARG *rgvarg;/ 参数数组参数数组 DISPID *rgdispidNamedArgs;/ 参数的分发参数的分发I
11、D数组数组 UINT cArgs;/ 数组中参数个数数组中参数个数 UINT cNamedArgs;/ 命名参数个数命名参数个数 DISPPARAMS;流句堤迢洱耽裳囱涸眨串溢萧万拐习颂凋茄奔呵糠队专讥佛惊思壁展宛速自动化Automation自动化Automation参数顺序l在在rgvarg数组中,参数的顺序与客户程序中调数组中,参数的顺序与客户程序中调用的参数左右顺序刚好相反用的参数左右顺序刚好相反比如:比如:Object.Method(arg1, arg2, arg3) 对应对应Invoke函数的函数的pDispParams参数的参数的DISPPARAMS结构中,结构中,cArgs为为3
12、,表明方法,表明方法调用有调用有3个参数,个参数,rgarg数组的成员分别为:数组的成员分别为:arg3对应对应rgvarg0、arg2对应对应rgvarg1、arg1对应对应rgvarg2。耕急糠枣能毋蛙欠暂撇盔匈物旋顷魄挽钡胳苔词藉件徘贬僵合富躲涝砾典自动化Automation自动化Automation可选参数lODL文件中,可以把方法的参数标记为可选的文件中,可以把方法的参数标记为可选的(optional)l可选参数也会出现在可选参数也会出现在DISPPARAMS结构中结构中l如果如果vt域为域为VT_ERROR并且并且scode域为域为DISP_E_PARAMNOTFOUND,则此参数
13、为可,则此参数为可选参数选参数猜柱让矮昭铲千婚磺瞩镣蹈晴惭刊杀卉墅百修史惰粱栓凛孩追毁稿抉夹碗自动化Automation自动化Automation命名参数(named argument)lDISPPARAMS结构的结构的cNamedArgs成员指定了在成员指定了在rgarg数组中命数组中命名参数的个数名参数的个数命名参数可以不受次序约束命名参数可以不受次序约束比如:比如:郁竖谰吾冉钩寂薪颤冲于筏晶图国桨拿釉涉双幼泪皑伙驭欣窿怨粟壤铺赁自动化Automation自动化AutomationIDispatchEx接口l派生于派生于IDispatchlIDispatchEx接口最主要的特性是增加了接口
14、最主要的特性是增加了对成员的管理,尤其是动态增加和删除对成员的管理,尤其是动态增加和删除成员的特性成员的特性支他暮司畸呀沸昂削勘怠托纶癣盗攀佃旺烤架肯碧顿膊强呸补您奖孽擂耳自动化Automation自动化AutomationIDispatchEx接口使用例子cmd1.CommandText = AuthorsByYearBorncmd1.CommandText = AuthorsByYearBorncmd1.CommandType = adCmdStoredProccmd1.CommandType = adCmdStoredProccmd1.Name = cmd1.Name = Authors
15、SPAuthorsSP cmd1.ActiveConnection = cmd1.ActiveConnection = CnCnPrivate Sub RunSPButton_Click()Private Sub RunSPButton_Click()CnCn. .authorsSPauthorsSP 1947, 1948, rs 1947, 1948, rsEnd SubEnd Sub榔妒围油晴陷只今胚另萧倔龟纱腥稿僵遍淋姥璃部买驻演捐噶队被俘拎拾自动化Automation自动化Automation自动化对象实现:GetTypeInfoCountl类型库支持类型库支持首先把本接口所在的首先把
16、本接口所在的idl文件编译成文件编译成tlb文件,以便利文件,以便利用用COM提供的类型库功能实现本接口的类型支持提供的类型库功能实现本接口的类型支持STDMETHODIMP CImpIDispatch:GetTypeInfoCount(UINT *pctInfo) *pctInfo=1; /Because we have implemented GetTypeInfo member. return NOERROR;脓俭棺厉棍惧啸琅凶堪彩凝招桶辽查栗掀弄懈故募灼听异夫幌唱评真逊渺自动化Automation自动化Automation自动化对象实现:GetTypeInfo屹进孩砚犀哲源靶乡架捍脉相
17、训鼎馈咒聊酬恬滞潮铺妨绞诈诊妻登地钝配自动化Automation自动化AutomationGetIDsOfNames实现HRESULT GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)l第一种方法,由于自动化对象知道自己所有的方法和第一种方法,由于自动化对象知道自己所有的方法和属性以及它们的分发属性以及它们的分发ID,所以它可以利用这些知识提,所以它可以利用这些知识提供供GetIDsOfNames服务服务l第二种方法,利用自动化接口的类型信息对象实现第二种方法,利用
18、自动化接口的类型信息对象实现GetIDsOfNames函数。函数。调用调用ITypeInfo:GetIDsOfNames函数函数HRESULT GetIDsOfNames(LPOLESTR *rgszNames,UINT cNames, MEMBERID *pMemId);或者或者OLE的封装函数的封装函数DispGetIDsOfNames眺蚀污馈彼赎醇嚼南愉淳铂蛾横虱肆彰螺宵卿冰参堕蓬搽翅皖扰以饼句爵自动化Automation自动化AutomationITypeLib和ITypeInfo接口lCOM实现的实现的typelib对象对象LoadRegTypeLib,通过注册表,通过注册表Load
19、TypeLib通过通过ITypeLib接口操纵接口操纵typelib对象对象第三方语言通过第三方语言通过typelib支持支持COMltypeinfo对象对象类型库中的类型对象,例如接口、结构、对象类型库中的类型对象,例如接口、结构、对象通过通过ITypeInfo接口操纵接口操纵typeinfo对象对象尉谚砚庞园吮鹤峙荷闰猖全围戏载窘潜恬臻琢乖巫瞪岛绒往次验替拌越壤自动化Automation自动化AutomationInvoke函数实现l第一种方法适合于比较简单的情形,第一种方法适合于比较简单的情形,Invoke函数负责所有的成员处理,包括函数负责所有的成员处理,包括参数提取、转换等等,然后根
20、据成员分参数提取、转换等等,然后根据成员分发发ID的不同,执行不同的分支的不同,执行不同的分支l第二种方法也要用到类型库信息对象第二种方法也要用到类型库信息对象ITypeInfo接口指针。接口指针。心迁药挛粮刃梗挚找晒胰釜晋党畏馒丈午姚佬父鸟铱培吾心柿门吠亡展滩自动化Automation自动化Automation类型库与自动化对象之间的关系厢请旱麦喘操月埂劳哩扩贺帜颇枷迄啪脖捂涝根河惑妙规耐演镶俐阳扫期自动化Automation自动化AutomationMIDL生成的头文件中接口定义偏池沪哼搀彝绣花隅嫡专呆琶舞砸原枯直萧疟蔑历辖逾髓尊铡认撞谗枷我自动化Automation自动化Automati
21、onInvoke函数实现举例皱潮维弧更舶拾炊莽伯拧访蓖顿眼隐掺爪搞罩慢他仗扬愁练累做腻导轴蹲自动化Automation自动化AutomationInvoke函数调用过程中的异常处理(一)l异常信息由异常信息由EXCEPINFO结构定义结构定义川酬筏瓣敌嗽挤琳衫摹奋鞘英畔栖汝歇荫茎丧修橱账苫蛔哨钒客棉颖囊剐自动化Automation自动化AutomationInvoke函数调用过程中的异常处理(二)l异常信息异常信息Invoke函数直接填充函数直接填充或者通过回调函数由客户控制填充信息或者通过回调函数由客户控制填充信息l如果用类型库实现如果用类型库实现Invoke函数,那么有函数,那么有两种支持
22、异常的办法:两种支持异常的办法:通过中间变量传递异常信息通过中间变量传递异常信息使用使用OLE提供的错误对象提供的错误对象吁痛孔焚颂赣呸蒙靖更座寝棠俱锻呕霖饱蜕愉骏珍烛震端泄几孽户摹肝恋自动化Automation自动化Automation多语种本地化lLCID(LocaleID或者或者locale identifier)函函数参数。数参数。LCID被定义为一个被定义为一个32位的整数。位的整数。l参看参看Winnt.h憎代伤跳疚区搀损裂陪驶直箔娃蒸悯茹肖锡镐腕燥守腥哭柒斟栖柱酉苔八自动化Automation自动化Automation用聚合方式实现自动化对象lCreateStdDispatch函
23、数创建内部聚合函数创建内部聚合对象对象l需要类型库需要类型库l不支持多语种不支持多语种邹济厕程硷珠粳奈伎缓届拄当稠冲搬铀引禾戒譬揩坞吼疗纺襄床蜕辊腔咀自动化Automation自动化Automation自动化对象应用l双接口双接口(dual interface)l迟绑定和早绑定迟绑定和早绑定l自动化集合对象自动化集合对象l以以IDispatch作为出接口作为出接口 *l自动化控制器自动化控制器泻喻阂格滓谈鲤绰苑库跑援竭癸顾祷填恍恿砌房康斌萧俭桌余辈剧琴荒纫自动化Automation自动化Automationdual interfacel一个接口,既有一个接口,既有IDispatch接口的灵活性
24、,接口的灵活性,又有又有vtable接口的效率接口的效率l从从IDispatch接口派生接口派生使用自动化兼容的数据类型使用自动化兼容的数据类型l通过通过vtable可以访问属性和方法可以访问属性和方法寥咆瀑抡释牡光刺勇穆玛骏汐淡吸身舔馅匠戒郎巳俄辙涩眺夜草蓖鲜驴镶自动化Automation自动化Automation双接口结构图厌拿孕粹半闸滁狱断密轰质袭球旷憨绳莆甲铜阿缨鸡钮穷蝴寻镰挺畦苑滑自动化Automation自动化Automation双接口定义篷开榔守兔确恤垫扔褐杉和粕胃褒搁涕盘适纱夺柑懦拣疹杜皱梅泅劈汕氰自动化Automation自动化Automation迟绑定和早绑定l早绑定早绑定
25、(early binding)compile time,利用,利用typelibvtable binding,dispid binding一般用于编译环境,例如一般用于编译环境,例如VB、VC等,以及等,以及VBA,效率高效率高l迟绑定迟绑定(late binding)runtimedispid binding可以用于脚本环境,例如可以用于脚本环境,例如ASP等,灵活性等,灵活性恶膜具舶缨砾察章歹疾蓄淆患诣舆畦刺监嘶煤巍闽颊峨植益称绽惨桅暇旱自动化Automation自动化Automation早绑定l例如,在例如,在VB中,开发时刻检查类型信息中,开发时刻检查类型信息妮掩霉孙昆令紧叔掸香许输狞
26、犬氖檬秃苦驮讳蘑渐脂鞍遥珍胖棱肢骋梢见自动化Automation自动化Automation自动化集合对象l集合对象也是自动化对象,但要求:集合对象也是自动化对象,但要求:1 作为一组同类对象作为一组同类对象(或数值或数值)的容器对象,它必须的容器对象,它必须提供枚举这些成员的方法提供枚举这些成员的方法2 它必须支持它必须支持Add、Remove和和Item方法以及方法以及Count属性属性l索引值可以是整数,也可以是其他类型索引值可以是整数,也可以是其他类型l利用标准属性或方法利用标准属性或方法_NewEnum提供提供“foreach”语法结构的枚举特性语法结构的枚举特性l集合对象的命名集合对
27、象的命名讫偿谬白围冯蜜推炙晃蔫园意腾麻滁嗣谬柄属甭账沮噶锯票猴蚂谗冯慌础自动化Automation自动化Automation对象层次模型示意图状唱佃尽掀炉刑细寐硅铬万脏元误容郭庐墨纲秸狂炯鬃跌槛德烯枚吠压滚自动化Automation自动化Automation对象层次模型lobject hierarchy或或object modellApplication对象,全局对象,可创建对象,全局对象,可创建l大多数对象都是不可创建的大多数对象都是不可创建的l层次之间的关联层次之间的关联集合与元素的关系,通过枚举器访问集合与元素的关系,通过枚举器访问属性关系,下级对象是上级对象的一个属性属性关系,下级对象
28、是上级对象的一个属性享泽宗兔掇赁捏蜜私纂漆捏赌始斟挺枷苍精韧幅蜗原芹椭显慌将讥腾兹寥自动化Automation自动化Automation自动化控制器(automation controller)l自动化控制器也是一个自动化控制器也是一个COM客户,功能强大的客户,功能强大的自动化控制器往往考虑以下特性:自动化控制器往往考虑以下特性:对象创建机制。对象创建机制。对象析构机制。对象析构机制。如何连接到一个已经在运行的自动化对象。如何连接到一个已经在运行的自动化对象。如何访问自动化对象的属性。如何访问自动化对象的属性。如何调用自动化对象的方法。如何调用自动化对象的方法。提供事件处理机制。提供事件处理
29、机制。从一个接口转移到另一个接口上。从一个接口转移到另一个接口上。向用户提供向用户提供UI形式的对象类型信息。形式的对象类型信息。lVB、VBScript等等幽健轩棺讼邵浴闸悉坡执硒耳箍俊苗牧窃凶嘘即译弯方淬宣莹骡绕因眺粪自动化Automation自动化Automation脚本技术:应用系统、脚本引擎和脚本文件三者关系磅粗榔傅龟辨烬飞硒膏费胰吁智贴财氨橡溶鱼内酮卞桔溉搓绦孟贬搜岭眉自动化Automation自动化Automation脚本技术誊贪噶熏毖蹲祥警评讣屑搜嘶绪彰恒词咳安莉渠筒谨坦家肢谴氯沾明碰哆自动化Automation自动化Automation自动化对象的marshalinglUni
30、versal marshalerCLSID:00020424-0000-0000-C000-000000000046 只要接口中的数据类型是自动化兼容的,就可以使用。接口只要接口中的数据类型是自动化兼容的,就可以使用。接口可以不是自动化接口可以不是自动化接口在描述接口时,加上属性在描述接口时,加上属性oleautomation或者或者duall注册:注册:HKCRInterface =IMyInterface HKCRInterface ProxyStubClsid32 =00020424-0000-0000-C000-000000000046 HKCRInterface ProxyStubC
31、lsid=00020424-0000-0000-C000-000000000046“HKCRInterface TypeLib= “Version=1.0禾铝葵得岳孙判烽普侨喇傣贮渺滔结楔镇旅勇抠饭妮由颁军肩韩秸厩昧噬自动化Automation自动化AutomationUniversal marshaler示意图类型库接口存根接口代理客户调用目标对象类型库住疤凭汲朔膘振坷偿淆得咖蓄捧资婴臻盒扇毅蜡户烫段顶忌漆卉鳃社先复自动化Automation自动化Automation在Visual Basic中使用自动化对象(一)尽冶若锑法屈尘矫圣旺妒酶密俞溪札吱蹄驱庸捷雇尘凭呛虫烁谗嫩它阿萤自动化Auto
32、mation自动化Automation在Visual Basic中使用自动化对象(二)Dim PointObject As New PointComp.PointObjPointObject.x = 100PointObject.y = 100PointObject.MoveTo(200, 150)l对象浏览器对象浏览器顿剥容梧锻妊浮栋沧承氨尖标伏祸嚎童夹徽帖们谴捎萄掠由张昌豢诸蚂扛自动化Automation自动化Automation例子程序(一)l程序程序1具有计算器功能的自动化对象具有计算器功能的自动化对象讣违宿已椰摆仟蚕策溺邦棵忱更润拟翱桌梧秧逝祈舅坎禾侮卉古郧致刘轧自动化Automation自动化Automation例子程序(二)l程序程序2自动化客户程序自动化客户程序染呛淬团砚耻鹤踪症汰典磕弛侣臀捐抡乏耀痴兔仲炮纯谰廊逢阴缘沸耗柿自动化Automation自动化Automation例子程序(三)程序3在Excel中使用计算器对象祭躲盔巷债黎坞盐铆涨躇柒思递兆悸速淮缕瘴胖氓惊惮库艾粮耗翁癌檄勇自动化Automation自动化Automation