`

Delphi COM编程技术四自动化技术

 
阅读更多

一、自动化技术的基础

1、 自动化名称介绍:

1>、自动化: 是一种从应用程序的内部自动控制另一个应用程序的方法。

2>、自动化对象: 指的是实现了IDispatch接口的COM对象,IDispatch接口是自动化对象的一个重要标志。因此,可以通过QuereyInterface()函数查询组件是否包含此接口,来确定该组件是否是自动化对象。自动化对象包括属性和方法,其属性只能被读取不能被写入。

3>、自动化组件:除了定义自动化对象外,还将内部可编程对象展现给自动化客户,而自动化客户则对这些暴露的自动化对象进行操作。

4>、早期连接/接口(early binding):早期连接是指对接口方法的所有调用在编译时检查参数是否正确;

5>、后期连接/Variants (late binding):后期连接指连接意味着方法调用直到运行时才被实现;Variant不是对象指针;对象的调用方法是后期连接;编写快速、简单的客户应用程序不用费力去输入一个类型库;

6>、派遣接口(DispInterface) :在接口和Variant中间的某个地方就是派遣接口;与接口有很多类似; 只是方便客户而设定的; 并没有在服务器上实现派遣接口;是服务器上实现了接口;假设服务器的COM对象也支持IDispatch接口,客户应用程序可以使用Variants或派遣接口;

7>、双重接口(Dual Interface):支持早期连接(接口)和后期连接(Variants);使用delphi创建的任何任何自动化服务器将自动支持双重接口;

2、使用自动化技术的目的:

1>、使用自动化技术的一个主要目的就是对COM的一些底层操作进行简化,包括自动化组件(用于定义自动化对象)和自动化客户(用于使用自动化对象)两方面的内容。

2>、通过自动化操作类型库。

3>、从应用程序的内部自动控制另一个应用程序的方法。

4>、客户通过使用接口、Variants派遣接口和双重接口创建并使用自动化服务器;

二、IDispatch接口:自动化对象的标志

1、IDispatch接口的定义:

IDispatch接口直接从IUnknown接口派生,接口定义如下:

interface IDispatch : IUnknown
{
 virtual HRESULT GetTypeInfoCount(UINT* pctinfo) = 0;
 virtual HRESULT GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo** pptinfo) = 0;
 virtual HRESULT GetIDsOfNames (REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgdispid) = 0;
 virtual HRESULT Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARMS* pdispparams, VARIANT* pvarResult, EXCEPINFO* pexcepinfo, UINT* puArgErr ) = 0;
}

2、IDispatch接口的中的函数:

1>、GetTypeInfoCount()成员函数:用于获取自动化组件支持的ITypeInfo接口的数目

2>、GetTypeInfo()成员函数:用于获取指针ITypeInfo接口的指针,通过该指针将能够判断自动化服务程序所提供的自动化支持。

3>、GetIDsOfNames()成员函数:将读取一个函数的名称并返回其调度ID(DISPID),DISPID只是一个long类型的数据,对于IDispatch的一个特定实现,此DISPID值应该是唯一的。
riid:为保留参数,必须设置为IID_NULL,
rgszNames:指定了成员的函数名及其参数,
cNames:标识了名字的个数,
lcid:参数用于指定本地化标识,如:GetUserDefaultLCID()
rgdispid:得到的DISPID 将保存到rgdispid中。

4>、Invoke()成员函数:提供了访问自动化对象暴露出来的方法和属性的方法。
dispidMember: 可以将DISPID作为函数指针数组的索引传入dispidMember参数,Invoke()将实现一组按此索引来访问的函数。
riid和lcid: 的含义与在GetIDsOfNames()中的定义相同,分别为保留参数和本地化标识。
WFlags: 指定了要访问的是接口的属性还是方法,
pdispparams: 包括了方法和属性调用的参数数组、DISPID数组以及数组中参数个数等信息。
pvarResult: 保存有返回值信息,可以使用NULL。
pexcepinfo: 指向一个有效的异常信息结构,可以使用NULL。
puArgErr: 参数包含了第一个产生错误的参数指针。可以使用NULL。

    通过GetIDsOfNames()和Invoke()的结合使用,将可以根据函数名称对方法和属性进行调用。这样,函数地址、AddRef()、Release()以及接口指针等细节问题将无需考虑。

3、IDispatch接口的使用实例(C++代码):

// 从ProgID得到CLSID
wchar_t progid[] = L"MSCAL.Calendar.7";
CLSID clsid;
if (FAILED(::CLSIDFromProgID(progid, &clsid)))// Calendar组件的ProgID转换为CLSID
 return;
// 得到IDispatch接口指针
IDispatch* pIDispatch = NULL;

//创建CLSID相应的组件并从输出IDispatch接口的指针
if (FAILED(::CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, IID_IDispatch, (void**)&pIDispatch)))
 return;
// 得到DISPID
DISPID dispid;
OLECHAR* func = L"Today";
if (FAILED(pIDispatch->GetIDsOfNames(IID_NULL, &func, 1, GetUserDefaultLCID(), &dispid)))
 return;
// 通过DISPID使用Today方法
DISPPARAMS dispparams = {NULL};
if (FAILED(pIDispatch->Invoke(dispid, IID_NULL, GetUserDefaultLCID(), DISPATCH_METHOD, &dispparams, NULL, NULL, NULL)))
 return;
// 将日期移动到今天
AfxMessageBox("日期成功移动到今天");

    这段代码使用的是Calendar组件,并通过IDispatch接口完成对Today()方法的调用。CLSIDFromProgID()将Calendar组件的ProgID转换为CLSID,并以此CLSID和IID_IDispatch作为参数去调用CoCreateInstance()以得到IDispatch接口指针。通过其成员函数GetIDsOfNames()得到将要调用的Today方法的DISPID,最后使用Invoke()成员函数执行此方法。


三、获取自动化服务器COM对象的方法

1、自动化服务器

1>、在本身应作为独立服务器应用程序的情况下,使用进程外自动化服务器非常好;

2>、自动服务器中的所有方法必须返回一个HResult,暗示是成功还是失败;
3>、所有其他参数必须在out参数中返回;

4>、访问自动化服务器的方法:通过接口、派遣接口、Variants(可使用的类名,CreateOleObject)、回调接口来控制此服务器;

l 派遣接口(DispInterface): 为事件提供了更好的支持;与VB兼容;实现事件是最兼容的方法、

l 接口(Interface): 不与VB兼容;但速度比派遣接口稍快;

l 回调接口(CallBack Interface):除非有极重要的原因否则不要使用;服务器做大量的工作,而刻户端不需要太多的工作;接口中定义回调方法,而不是使用派遣接口把事件送回到客户端; 回调接口在服务器中定义,但在客户中实现; 如果知道服务器和客户提供的接口,回调接口更有效;

2、 进程内自动化服务器

    进程中的服务器是作为动态连接库(DLL)实现的,这意味着该服务器在运行时被动态地放进你的进程中。COM服务器将成为你应用中的一部分,而COM操作在应用的线程中进行。事实上,许多的COM对象都是以这种方式实现的,因为性能很好。一个COM函数调用的系统开销很小,但你可以得到COM所有的设计和重用的好处。COM自动处理载入和卸下该DLL。
CreateOleObject函数:总是创建特定服务器的新实例;
GetActiveOleObject函数: 用来获取正在内存中运行的服务器的引用;
例如:创建并使用进程内自动化服务器;
Procedure StartOrLinkToWord;
var

v: Variant;
begin
try
v := GetActiveOleObject('Word.Basic'); //判断是否Word已启动;
except
v := CreateOleObject('Word.Basic'); //否则启动Word; 通常自动化服务器启动是隐藏的;
v.AppShow; //显示Word应用程序;
end;
V.FileNew; //创建一个新的文档;
v.Insert('Automation is easy!');
end;

3、 进程外自动化服务器

    一个进程外的服务器令客户和服务端的区分更明显。该类服务器作为一个独立的可执行(EXE)程序运行,因此处在一个私有的进程空间中。EXE服务器的启动和停止在Windows中服务管理器中进行(SCM)。COM接口的调用通过内部的进程通信技术来处理。服务器可以运行在本地的机器,或者在一个远程的计算机上。如果服务器在一个远程的计算机上,我们称它为“Distributed COM,分布式的COM”,或者DCOM。

四、 自动化ADO: Microsoft最新的数据库技术;

1、主要组件:Connection、RecordSet、Command;
1>、Connection对象: 用于连接到一个本地或远处的数据库;连接数据库:Connection.Open();
2>、RecordSet对象: 提供了一个记录集的连接;打开记录集:RecordSet.Open()
3>、Command对象: 向数据库发出命令,应使用Command对象(与Parameter一起工作);
4>、访问字段值:访问Field对象的值: RecordSet.Fields.Item[FieldNo].Value;
5>、访问字段名称:RecordSet.Fields.Item[FieldNo].Name;
6>、数据库错误处理:Error对象,该对象提供任何错误的详细代码;


分享到:
评论

相关推荐

    110_《Delphi4编程技术内幕》

    通过本书的学习,读者不仅可以快速了解Delphi 4编程的要旨,还可以掌握许多新技术,如创建COM自动化服务器和客户程序、使用MIDAS进行多层数据库计算、使用DCOM跨网络分布数据库等。 本书最大的特点是代码丰富,不仅...

    DELPHI 5编程实例与技巧

    本书共分三部分、16章,主要介绍Delphi 5集成开发环境,对象Pascal语言、组件、通用编程技术、动态链接库、多线程、多媒体编程、数据库编程、网络编程和Windows API编程等。 目 录 前言 第一部分 Delphi编程基础 ...

    052_《Delphi网络应用开发技术与实例》

    全书共分为10章,循序渐进地介绍了Delphi网络实用开发技术,主要包括网络通信基础与Delphi 6.0新特性、COM编程、创建和使用ActiveX控件、自动化服务器与客户、WinSock开发、TCP协议及使用、常用网络控件、基本网络...

    092_《Delphi6高级编程》

    全书分8篇,共19章,主要包括OLE自动化、DLL的使用、多线程编程、Delphi的文件处理、GUI开发、多媒体应用的开发、组件开发、网络编程等方面的内容。所附光盘包含书中全部实例源代码。 本书内容翔实,实例丰富,解析...

    delphi经典编程入门

    Delphi是全新的可视化编程环境,为我们提供了一种方便、快捷的Windows应用程序开发工具。它使用了Microsoft Windows图形用户界面的许多先进特性和设计思想,采用了弹性可重复利用的完整的面向对象程序语言(Object-...

    Delphi 5编程实例与技巧

    第一部分 Delphi编程基础 第1章 Delphi集成开发环境 1 1.1 集成开发环境简介 1 1.2 集成调试器 5 1.3 开发环境的优化 6 1.3.1 自定义工具栏 6 1.3.2 编程环境设置 7 1.3.3 编辑环境设置 8 1.3.4 工程设置 8 1.4 方法...

    Delphi技术手册

    第四章 并发编程 线程和进程 TThread类 BeginThread和EndThread函数 线程局部存储 进程 未来化 第五章 语言参考 第六章 系统常量 Variant类型码 开放数组类型 虚方法表偏移值 运行时错误代码 第七章...

    Delphi系统开发实例精粹

    【中图法分类号】TP311.56 (工业技术>自动化技术、计算机技术>计算技术、计算机技术>计算机软件>程序设计、软件工程>软件工程>软件工具、工具软件) 【参考文献格式】刘山,赵辉编著. Delphi系统开发实例精粹. 北京...

    Delphi6分布式开发

    4.2.l 创建自动化对象 4.2.2 dcom服务器的安装 4.3 dcom客户程序的创建 第5章 com十分布式应用的开发 5.1 com十系统构架 5.1.1 com十简介 5.1.2 com十的系统构架 5.2 com十组件的开发 5.3 客户...

    基于单片机和delphi串行通信的步进电机控制 自动化课程设计报告

    在现代电子产品中,步进电机广泛应用于ATM机、喷绘机、刻字机、写真机、喷涂设备、医疗仪器及设备、计算机外设及海量存储设备、精密仪器、工业控制系统、办公自动化、机器人等领域。所以步进电机的控制是一门很实用...

    Delphi6数据库开发典型实例

    本书通过实例深入讲述了Delphi 数据库编程技术及技巧。 第 1 章介绍了Delphi 数据库开发工具,包括BDE Administrator、SQL Explorer、SQL Monitor 和Database Desktop 等数据库工具的使用。 还介绍了SQL 语言,包括...

    Delphi程序开发范例宝典(第3版).正解的

    《delphi程序开发范例宝典(第3版)》适用于delphi编程人员,也可供大中专院校相关专业的师生学习参考。 《delphi程序开发范例宝典(第3版)》 第1章 窗体与界面设计 1 1.1 菜单应用 2 实例001 在系统菜单中...

    Delphi5开发人员指南

    第1章 Delphi 5下的Windows编程 1 1.1 Delphi产品家族 1 1.2 Delphi是什么 3 1.2.1 可视化开发环境 3 1.2.2 编译器的速度和已编译代码的效 率 4 1.2.3 编程语言的功能及其复杂性 4 1.2.4 数据库结构的灵活性和可...

    Delphi 深度探索(第二版)〖含随书光盘源代码〗

    1.2.1 office自动化编程 1.2.2 创建office2000插件 1.3 基于com的数据库开发 1.3.1 adox的数据库开发 1.3.2 sqlserver-dmo数据库开发 1.3.3 ole结构化存储及其在公文包型数据库中的应用 第2章 ...

    串口调试助手Delphi版 v1.0

    串口调试助手 v1.0 使用说明本程序完全参照龚建伟《串口调试助手V2.2》制作而成,原软件是用VC编写的,我将它改用Delphi编写,作为我学习串口编程的一个例子与工具使用。其中用到串口控件为ComPort,该控件为开源...

    Delphi 7 新概念百例

    《Delphi 7 新概念百例》是一本通过讲解Delphi实例,来说明使用Delphi编程时通常采用的编程思路以及具体方法的计算机书籍。通过对每个实例从编程思路和代码实现的详细分析和讲解,力求带领读者快速地提高自己的程序...

    一款超强的图形系统——Delphi源码Delphi-source-VG7.23

    这是一套是一套非常完善的图形系统,适合在电力、煤炭、化工、仿真、网络、自动化等各种工业监控软件以及图形建模、图形管理、图形分析、中小型GIS系统、工作流、中文表格、表单、工程绘图等软件项目中应用。...

    精通Delphi数据库设计与实例开发配套光盘

    Delplli是Borland公司推出的可视化开发工具,它拥有世界上最快的编译器,并提供了丰富的组件集、强大的代码自动生成功能和丰富的数据库管理工具等,使用它的集成开发环境,编程人员可以更快地建立应用程序。...

    Delphi+Access仓库管理系统设计

    Delphi是全新的可视化编程环境,为我们提供了一种方便、快捷的Windows应用程序开发工具,在其环境下能够非常方便,快速的进行应用程序的开发。本系统是在Delphi6作为开发平台的。它具有这样几个方面的优点:强大的...

Global site tag (gtag.js) - Google Analytics