Exchange开发中CDO对象的使用基础(1)

Exchange 的 CDO 对象集合

一:关于 CDO 对象集合的说明

CDO 对象集合是建立协作是应用程序的可靠的 API,ADO 可以用来存取 WEB 存储系统,但是他缺少协同作业最基本的功能,而 CDO 却可以处理一般的应用程序和高级的工作流应用程序解决方案, CDO 甚至可以提供我们管理 exchange 的能力,以及与 windows 2000 的 AD 通讯。

CDO:collaboration data objects, 是一项可以用来建立用途广泛的协同作业应用程序的技术,能完成如:接受传送电子邮件、日程安排、联络人管理、工作流程以及 exchange 管理的应用程序。

CDO 并不是被封装成为一个单独的对象模块,相反的,它包含了 3 个不同的对象模块,每一个都有其特定的用途。可以同时或者单独使用这些物件模块。

三个对象模块的 DLL 文件信息:

CDO FOR EXCHANGE 2000 SERVER CDO.DLL

CDO FOR EXCHANGE MANAGEMENT CDOEXM.DLL

CDO WORKFLOW FOR EXCHANGE CDOWF.DLL

二:三个对象模块的基本功能

1. CDO for exchange 2000 server

最常用的 CDO 对象模块,该物件模块包括了一些协同作业应用程序中最常见的核心组件与接口。也可以使用该对象模块来建立与设定 web 存储系统中的文件夹,其中最上层的 cdo 对象常用来建立以下几种解决方案:

文件夹:( folder ) 在信箱存放区或公用存放区的容器。

人员:( person ) WEB 存储系统文件夹中的联络人类型的资料,或者是 AD 中的使用者或联络人对象。

邮件:( message ) 电子邮件

约会:( appointment ) 已经安排的约会或会议

日历信息 ( 日程安排 ) :( calendar message ) 会议邀请

收件者:( addressee ) 任何形式的电子邮件收件者或会议邀请的收件者

出席者: (attendee) 包含于约会或者会议中的人员

所有最上层的对象都有两个重要的共同接口( interface )

Iconfiguration : 用来定义可以应用于多个对象的行为模块,

Idatasource :每个 CDO 对象都公开 Idatasource 接口,用来管理、存放与存储资料。

2. CDO for exchange management objects

该对象模块是用来建立以及管理 exchange 信箱与 exchange 服务器组件的类别和接口所组成。当编写用来管理 exchange 收件者和信箱的程序代码时,会常用到。使用的对象是:

IMailRecipient : 针对使用者指定电子邮件如何传送与管理,此对象也可以使联络人与文件夹不需要信箱便可以接收电子邮件。

IMailboxStore : 指定如何建立、移动、删除 exchange 信箱,以及如何管理可使用信箱的收件者其可用来管理的属性。如果开发 WEB 架构的服务器管理工具,该对象模块提供让我们可以整体的管理服务器的对象,这些状况可用的最上层的对象有:

ExchangeServer: 管理 exchange2000 服务器与传回基本信息,如服务器类型与版本。

FolderTree : 管理服务其中的文件夹树状结构,包含任何副本。

StorageGroup : 管理储存群组,用来组织信箱存放区和公用存放区。

MailboxStoreDB : 管理单一使用者的信箱存放区可以使用此对象来连接、移动或中断连接信箱存放区,并传回有关存放区数据库的基本信息。

PublicStoreDB : 建立、管理与删除公用存放区,并传回有关存放区数据库的基本信息。

3. CDO Workflow for Exchange

该对象模块是由用来建立以及执行工作流程与路由应用程序的类别和接口所组成。建立工作流应用程序有两种方式:

方式一:使用 Workflow designer for Microsoft Exchange 2000 Server

方式二:使用自行建立工作流程事件流程与事件接受的方式。

我们使用前者,使用 WorkFlow Designer 我们就不需要大部分的工作流程对象,只有当编写回应各式各样工作流程动作的 Script 时,才需要使用这些对象,在我们的 Script 中最可能用到的对象如下:

IWorkflowSession :提供工作流程引擎、动作的 Script 与所处理的工作流程项目( ProcessInstance )之间的执行期( run-time )通讯。

IworkflowMessage :建立工作流程处理中要传送给收件者的通知邮件。

AuditTrailEventLog : 于应用程序记录档( log )中 , 建立有关工作流程事件动态的项目( entries )。

如果使用 Workflow Designer 无法提供完成要设计的功能,那就要自行建立事件接受,如果自行建立事件接受还需要熟悉下列对象:

ProcessDefinition : 定义工作流程中的逻辑,包含状态与动作。

ProcessInstance : 控制、记录与监视移动于工作流程处理之间、个别独立的工作流程项目的状态。

三:开始使用 CDO

1. 由类别建立对象

CDO 由多种 COM 的类别所组成,是用来建立新对象的基础,当一个对象被建立的时候,这些类别会决定对象标准的预设功能。如: CDO 的 message 类别是用来定义新的 Message 对象,每个 Message 对象都有相同的标准功能,允许对象被传送与接受。

使用 VB 创建一个 Message 对象的例子:

dim msg as cdo.message

set msg=new cdo.message

使用 Vbcript 创建一个 message 对象 :

dim msg

set msg=server.createobject(“cdo.message”)

这样我们就可以存取此类别预设接口中的属性与方法,以及任何该类别公开的其它接口。

使用完对象变量之后应该释放对象变量占有的内存 :set msg=nothing

2. 使用介面(接口)

界面定义了一个由属性和方法封装在一起的集合。

类别通常有多个与其相关联的介面,包含一个预设( default )的介面,此预设介面拥有类别既定的预设功能。预设介面与该对象呈现的名称相似,只是在对象名称前多了一个字母 I, 表示这是一个相对于类别对象的介面,如 person 类别有一个管理所有属性与方法的 IPerson 介面,特别用来定义与管理联络人类型的信息。这个预设的介面是由其所属对象直接公开,也就是我们可以由对象直接呼叫属性和方法。我们可以直接调用 Person 对象的 e-mail 属性,程序代码如下 :

dim prs as cdo.person

set prs=new cdo.person

prs.email= [email protected]

除了默认介面以外,大部分的类别至少使用一个以上的其他介面,这些预设介面也会被其他类别所使用。参照介面以后才能够存取其属性和方法,可以轻易的经由调用相关属性来实现。如 ;Idatasource 介面经由 Datasource 被存取,代码如下 ;(VB)

dim dsrc as Idatasource

set dsrc = prs.datasource

有些介面没有用以参照的相关属性,这时因该分情况采取不同措施,如果使用 VB, 则先宣告一个对象变量作为适当的介面,然后通过将介面对象变量指向对象公开的介面,自动完成参照介面的动作,如 CDOEXM 的 IMailRecipient 介面

VB:dim fld as cdo.folder

Dim rcp as cdoexm.imailrecipient

Set rcp=fld

Vbscript, 不能为变量预先设定数据类型,必须使用 getinterface 方法存取介面,几乎每个 CDO 对象都公开用以存取介面的 GetInterface 方法,范例如下:

Set rcp = fld.getinterface(“imailrecipient”)

四:存取结构描述属性

ADO 需要使用 fields 对象集合才能存取结构描述属性,而 CDO 提供一种更简单的方式,许多比较一般的结构描述属性都可经由 CDO 属性来存取。如:我们可以存取 Person 对象中的 urn:schema:contacts:HomePhone 结构描述属性,代码如下:

prs.HomePhone=”555-555-0101”

对结构描述属性而言并没有相等的 CDO 属性,必须使用 adofields 对象集合,它具有相同的属性与方法。要存取对象集合中的特定属性,就要传送完整并且合格的结构描述属性名称,若有相同的 CDO 相关常数( constant )也要一起传递,这些常数以 cdo 开头且包含于 CDO 函数库中,可以使用这些常数以省去传送完整属性名称的麻烦,使用 CDO 常数来传送时,其名称并不需要加上引号,如下例存取 urn:schemas:contacts:FTPSite 的属性:

prs.fields(cdoFtpSite)=”somearchive.edu”

如果要存取的结构描述属性没有可用的 CDO 属性或常数,就必须传递完整且合格的结构描述属性名称给 Fields 对象集合。下面的例子和上面的程序代码效果相同:

prs.fields(urn:schemas:contacts:ftpsite)=”somearchive.edu”

为了使程序更容易读懂,当程序中使用的属性不存在 CDO 属性或没有建立结构描述常数,我们应该为应用程序定义自己的常数。

五:使用 URL

与 ADO 一样, CDO 也是依赖于 URL 以及 ExOLEDB provider 来存取 Web 存储系统中的资源,所要被存取的资源必须以完整的文件夹路径与显示名称( displayname )建构正确的 URL 地址,如果文件夹路径或项目的显示名称中有空格字符,那在 URL 中也必须保留名称中的任何空格字符。

CDO 也支持相对的 URL 用法 .

六:了解并使用 Idatasource 介面

IDataSource 介面是使用 CDO 存取 WEB 存储系统中资源的关键,所有的 CDO 对象经由 DataSource 属性公开 IDataSource 介面, DataSource 属性可以用来在 WEB 存储系统中开启资源、侦测与储存资源的变更,以及建立新资源。

IDataSource 介面的属性与方法,下面是 IDataSource 介面公开的属性和方法

![](http://dev.csdn.net/article/21/D:/Documents and Settings\storm\My Documents\My Pictures\Idata.JPG)

七: IDataSource 介面的运作

使用 CDO 开启一个资源时,并非动态的连线到 WEB 存储系统,而是将资料由 WEB 存储系统中复制一个副本到本机的 CDO 对象,所以实质上您会有两份资料,一份再 WEB 存储系统中,另一份再 CDO 对象中,使用 CDO 对象的属性方法对资料所作的任何改变都是本机上的资料副本,而不是 WEB 存储系统中的资料,直到使用 IDataSource 的储存方法明确地指定要对资料作变更 WEB 存储系统中的资料才会被变更。如不调用一个储存方法,则变更的资料副本就会丢失。

建立一个新的资源也是同样的道理。

八:使用 CDO 开启一项资源

使用 CDO 对象中的 DataSource.Open 方法,它是以 record.open 方法为基础的开启资源的方法。 CDO 使用的 open 方法语法如下:

open ( source url as string [,activeconnection as object] [ , mode as connectmodeenum 指定 record 如何被开启 ]) 默认以只读方式打开。

判断资料来源是否在本机被修改过: IDataSource 介面的 datasource.isdirty 属性 (boolean 值 )

可以使用该属性判断本机的 CDO 对象是否被变更,如果变更,则使用 datasource.save 方法保存变更。

九:使用 CDO 建立新资源

先为新资源建立一个 URL, 再将新资源的相关信息存储到该 URL,datasource.saveto 方法可以让您指定所建立资源的 URL,URL 必须是资源的精确的实际位置,还必须包含资源的 DAV:displayname.

Datasource.saveto 方法的语法:

Saveto(sourceurl as string [,activeconnevtion as object] [,mode as connectmodeenum] [,createoptions as recordcreateoptionsenum])

Mode, 指定 record 如何被开启

Createoptions, 指定资源如何被建立, adcreateoverwrite 将会覆盖已经在 URL 上存在的相同名称的资源项目 , 如果不设这个常数,则如果 URL 已经存在此资源的话,将会返回一个错误。

Datasource.savetocontainer 方法语法,该方法语法和 saveto 方法相同

两者的区别: saveto 方法是具体知名资源项目的 URL 和 DAV:displayname, 然后将资源项目存放到指定的 URL, 名称为指定的 DAV:displayname, 而 savetocontainer 方法则是将资源存放到指定的 URL, 资源的 DAV:displayname 时 exchange 自动产生的一个名称。

该方法的用途: savetrocontainer 方法在日程安排、建立约会时用得比较多,因为日程安排项目很多,时常有同名的约会名称,我们可能会将前面已经建立的越会覆盖掉,为了防止这样的事情发生,我们应该采用 savetocontainer 方法。

十:使用其他对象开启 CDO 对象

可以使用 datasource.openobject 方法由其他记忆体中的对象打开 CDO 对象,而记忆体中的对象可以是其他 CDO 对象或是其他函数库的对象,比如 ADO2.5

openobject 方法的语法如下:

openobject(soure as Unknown, InterfaceName as String)

Source: 被要打开的对象所参照的已打开对象,例如一个 ado record 或一个已开启的电子邮件,通常是一个对象变量

<P class=MsoNormal s

Published At
Categories with 数据库类
Tagged with
comments powered by Disqus