自动化( Automation 潘爱民 http://www.icst.pkuedu.cn/compcourse
自动化(Automation) 潘爱民 http://www.icst.pku.edu.cn/compcourse
内 自动化基础 自动化对象实现 自动化对象应用 自动化编程
内容 • 自动化基础 • 自动化对象实现 • 自动化对象应用 • 自动化编程
自动化产生与发展 弱类型的高级语言(比如 Visual basic)如何 使用COM? VBA(或 VBScript) 自动化与COM的关系 自动化的广泛应用
自动化产生与发展 • 弱类型的高级语言 (比如Visual Basic)如何 使用COM ? • VBA( 或VBScript) • 自动化与COM的关系 • 自动化的广泛应用
几个概念 自动化对象 实现了 IDispatch接口的COM对象 属性和方法 OD(对象描述语言) 类型库 自动化兼容的数据类型
几个概念 • 自动化对象 – 实现了IDispatch接口的COM对象 • 属性和方法 • ODL(对象描述语言) • 类型库 • 自动化兼容的数据类型
属性( (property和方法 method 自动化对象的两个基本特性,都具有符 号化的名字,用 DISPID来标识 属性是指自动化对象的数据特征 属性可以由索引,索引可以是整数,也可以是其他 类型 方法是指自动化对象所提供的功能服务 方法比属性要灵活得多,可以包含参数
属性(property)和方法(method) • 自动化对象的两个基本特性,都具有符 号化的名字,用DISPID来标识 • 属性是指自动化对象的数据特征 – 属性可以由索引,索引可以是整数,也可以是其他 类型 • 方法是指自动化对象所提供的功能服务 – 方法比属性要灵活得多,可以包含参数
类型库( typelib 类型信息是客户程序与组件对象之间通讯 的基础 IDL和ODL 接口类型信息使用 dinterface或 idispinterface.键字描述 对象类型信息使用 coclass关键字描述 · library关键字描述库信息 个组件程序中的所有对象放在一个ODL文件中,并 用 library关键字描述库信息 工具MDL:从ODL(DL编译成TB文件
类型库(typelib) • 类型信息是客户程序与组件对象之间通讯 的基础 • IDL和ODL – 接口类型信息使用interface或dispinterface关键字描述 – 对象类型信息使用coclass关键字描述 • library关键字描述库信息 – 一个组件程序中的所有对象放在一个ODL文件中,并 用library关键字描述库信息 • 工具MIDL:从ODL(IDL)编译成TLB文件
ODL描述举例 uuid(3C591B20-1F13-101B-B826-00DD01103DEI), //LIBID Point helpstring("Point 1.0 Type Library"), lcid(0×000 version(1.0) library Point importlib("stole tlb"); uuid(3C591B25-1F13-101B-B826-00DD01103DE1),//IID IPoint. helpstring(IPoint interface. ") interface IPoint: IUnknown Ipropget, helpstring("Returns and sets x coordinate. " )I HRESULT X(out, retval] int* retval); 未完
ODL描述举例 [ uuid(3C591B20-1F13-101B-B826-00DD01103DE1), // LIBID_Point. helpstring("Point 1.0 Type Library"), lcid(0x0000), version(1.0) ] library Point { importlib("stdole.tlb"); [ uuid(3C591B25-1F13-101B-B826-00DD01103DE1), // IID_IPoint. helpstring("IPoint interface."), ] interface IPoint : IUnknown { [propget, helpstring("Returns and sets x coordinate.")] HRESULT x([out, retval] int* retval); 未完
OD描述举例(续一) Ipropput, helpstring( "Returns and sets x coordinate. )I HRESULT X(in] int Value); Ipropget, helpstring ("Returns and sets y coordinate. )I HRESULT y(out, retvall int* retval); Ipropput, helpstring("Returns and sets y coordinate. ) I HRESULT y(in] int Value); Thelpstring("Move Point To. )I HRESULT Move To(lin) int newX, in] int newy ); uuid(3C591B26-1F13-101B-B826-00DD01103DE1),//IID DIPoint helpstring"DIPoint interface"), dispinterface DIPoint interface IPoint: 未完
ODL描述举例(续一) [propput, helpstring("Returns and sets x coordinate.")] HRESULT x([in] int Value); [propget, helpstring("Returns and sets y coordinate.")] HRESULT y([out, retval] int* retval); [propput, helpstring("Returns and sets y coordinate.")] HRESULT y([in] int Value); [helpstring("Move Point To.")] HRESULT MoveTo([in] int newX, [in] int newy); } [ uuid(3C591B26-1F13-101B-B826-00DD01103DE1), // IID_DIPoint. helpstring("DIPoint interface."), ] dispinterface DIPoint { interface IPoint; } 未完
ODL描述举例(续二) uuid(3C591B21-1F13-101B-B826-00DD01103DEI), /CLSID Point helpstring("Point Class"), mapobject coclass point default dispinterface IPoint; }∥/ for library
ODL描述举例(续二) [ uuid(3C591B21-1F13-101B-B826-00DD01103DE1), // CLSID_Point helpstring("Point Class"), appobject ] coclass Point { [default] dispinterface IPoint; } } // for library
另一个ODL接口例子 uuid(BFb737-822A-1068684900DD011087E8 version(1.0), helpstring( "Useful help string ) helpcontext(2480) dispinterface My Dispatchobject properties id(1)int x; //An integer property named x id(2) BSTR y; //A string property named y methods id (3)] void showO: //No arguments, no result [id(ll)] int computeit(int inare, double*outarg);
另一个ODL接口例子 [ uuid(BFB73347-822A-1068-8849-00DD011087E8), version(1.0), helpstring("Useful help string."), helpcontext(2480) ] dispinterface MyDispatchObject { properties: [id(1)] int x; // An integer property named x. [id(2)] BSTR y; // A string property named y. methods: [id(3)] void show(); // No arguments, no result. [id(11)] int computeit(int inarg, double *outarg); };