请参考
http://www.cn.filename.info/f/winfax.dll.html
另外,给你Copy一大段,希望对你有所帮助
这个又是先贴到记事本然后贴过来的,格式没有了,呵呵
这个也是很久以前的东西,如果有地方不准确的话,还请大家见谅!
里面的插图大家可以看msdn(这里不能直接拷贝进来图形,好麻烦,sorry)
传真服务篇
第1章 微软传真服务简介
微软®传真服务是使网络用户可以从应用程序中收发传真的一种兼容TAPI(电话应用程序接口)的系统服务,此服务可在微软®Windows® 2000及以后版本获得并具有以下特点:
⑴传送传真
⑵灵活的接收传真
⑶存档已发送的传真文件
⑷服务器和设备配置管理
下表详细列出了可用来开发传真客户程序和扩展传真服务的应用程序接口(API)。
传真服务客户API 软件开发者能在客户应用程序里合并基本的传真函数,包括输出传真服务、查询和管理传真作业及传真设备。
传真路由扩展API 第三方的软件供应商通过定义输入传真路由扩展来扩展传真服务。此扩展提供了一种灵活的方法以连接接收传真的应用程序,如:打印、保存传真,变换传真图形图像到文本文件等。
传真服务供应商API 传真设备制造商提供符合国际电信联盟(ITU)T.30 规范的非调制解调器电话设备支持的传真服务供应商。(微软调制解调器传真服务供应商提供 的T.30传真协议支持带有传真服务调制解调器设备。)
下图显示了传真服务的基本结构
传真服务供应商和传真路由扩展动态链接库(DLLs)由微软®或设备制造商(OEM)提供。
第2章 传真服务客户应用程序接口( API )
传真服务客户API允许客户在其应用程序中合并基本传真功能。此项技术适用于运行windows 2000及更高版本的计算机。API包括win32函数和COM双重接口实现。
本章第一部分构画使用传真服务客户 API可以实现的任务及支持该功能所需的组件,同时也描述了传真服务的安全性,最后对传真端口、传送传真、传真封面和传真路由方法进行了简洁讨论。第二部分讨论win32和COM实现环境下传真程序的差别。还讨论了传真客户函数、COM双重接口以及下列有关的编程任务。
⑴连接到传真服务器
⑵传真服务器配置管理
⑶传真设备管理
⑷管理传真路由数据
⑸发送传真
⑹管理传真作业
⑺释放传真资源
⑻断开与传真服务器的连接
注:在阅读本篇之前,应该对电话应用编程接口( TAPI )和微软®电话服务供应商( TSPI ) 有所熟悉,如果计划使用传真客户的COM实现,也应该熟悉COM (部件对象模型)和自动化编程概念。
2.1、传真服务客户 API 简介
微软®的传真服务为在本地网(LAN)上的客户提供传真服务。传真服务客户 API 允许开发者在其应用程序里合并服务并激活基本传真功能。传真服务客户API 包括Win32 函数接口和 COM 接口。
⑴Win32 环境
Win32 函数作为动态链接库 WinFax.dll文件被实现。这是一种客户机/服务器实现模式,允许远程计算机上的传真客户与使用 RPC 的传真服务器进行通讯。客户机可以使用共享网络传真打印机访问输出传真服务,或者应用程序可以调用传真服务客户 API中的函数连接一台远程传真服务器进行传真传送。
⑵ COM 实现环境
COM 接口作为双重接口被VB和C/C++程序员接纳与实现。本文为两种编程语言均提供参考资料。
下图显示了传真客户应用程序的概貌:
要实现传真服务,必须在原代码文件中包含WinFax.h 头文件,而要使用微软支持的传真客户COM实现则必须包含 FaxCom.h头文件。
2.1.1、传真服务客户API功能
传真服务客户 API使传真客户应用程序可以执行下列任务:
⑴传送一个存储于计算机中的文档。应用程序能把文档作为一份传真传送到一个或广播到多个程序定义的接受者。
⑵传送一张封面页。用户可以用传真传送一张封面页,该封面可为服务器上的公用封面页,也可以是一张个人的封面页。
⑶通过将打印文档为设备上下文来传送活动文档。基于文档的应用程序可以阻止传真发送向导的显示。程序能够直接为传真客户图形设备接口(GDI)提供传送信息,并且将它打印到一个传真设备上下文来传送一份活动文档。
⑷传送一份传真文档到活动调用。使用已经存在的输入链接线路来传送文档可以节约发送传真的费用,这就是所谓的“Faxback服务”。
⑸使用传真发送向导发送活动文档。用户可以通过把文档打印到传真打印机来传送该文档。传真发送向导会收集用户的传送信息,而开发者则只需使用打印功能即可。
⑹改变传真设备和传真服务器的配置。应用程序可提供配置管理或可使用微软管理控制台( MMC ) 插件组件中的传真配置服务管理应用程序来进行配置。
2.1.2、传真服务客户 API 软件要求
下列组件被要求支持传真服务客户API的功能 :
⑴ 传真服务( FaxSvc.exe )。支持传真服务的应用程序可以管理传真设备、配置数据、提供打印服务并收发传真文件。通过传真路由扩展传真服务也可以初始化和重发输出传真路由方法。
⑵winFax.lab。包含传真服务客户 API功能的静态链接库。
⑶winFax.dll。包含传真服务客户 API 功能的动态链接库。
此外,必须在源代码文件中包括 WinFax.h 头文件;而使用微软支持的传真客户 COM 实现,则须包括 FaxCOM.h头文件。
传真服务可以与使用 RPC 的网络客户机进行通讯。尽管不需要在每台客户计算机上安装传真服务,但服务一定要可以由 RPC访问到客户计算机。
2.1.3、传真服务可执行文件和相关文件
下列表格描述了与传真服务相关的可执行文件、 DLL和头文件。
文件名 描述
FaxSvr.exe 管理传真设备、配置数据、提供打印服务和收发传真文件的传真服务支持应用程序,
FaxAdmin.dll 微软管理控制台( MMC )插件组件之一的传真服务管理应用程序,提供配置管理功能。
FaxMon.dll 包含传真打印监视器的动态链接库
WinFax.dll 包含传真服务客户API功能的动态链接库
WinFax.lib 包含传真服务客户API功能的静态链接库
FaxCom.dll 传真服务客户API的COM接口
FaxCover.exe 传真封面页编辑应用程序
FaxExt32.dll 包含 MAPI用户接口扩展的动态链接库
FaxXp32.dll 包含传真邮件传送功能的动态链接库。
FaxRoute.dll 包含微软®传真路由扩展的动态链接库。
FaxDev.h 包含传真服务供应商 API 原型的头文件。
FaxRoute.h 包含传真路由扩展API 原型的头文件
WinFax.h 包含传真客户服务 API Win32环境原型的头文件
FaxT30.dll 包含微软®调制解调器传真服务提供商的动态链接库
FaxDrv.dll 传真打印机驱动程序动态链接库
FaxUi.dll 传真打印机驱动程序动态链接库
2.1.4、设备和配置管理
传真服务提供的传真服务管理应用程序是微软管理控制台( MMC )插件组件之一,传真客户程序可以进行配置管理或使用管理程序进行下列配置管理任务:
⑴指定收发传真的器件
⑵指定可在端口上执行的路由方法
⑶配置全局服务数据
2.1.5、传真端口
本章中,传真端口始终被看作是一台传真设备以及与设备相联系的配置和与输入信息路由,传真服务为用户提供一个或多个传真端口作为传真传送的终点。
传真虚拟设备也存在传真端口,这就意味着传真可以输出到连接至传真服务器的非严格物理设备终端。支持互联网传送传真的传真服务供应商即是使用虚拟传真设备的供应商的例子。
2.1.6、传真端口的访问级别
传真服务客户 API 允许应用程序查询和修改传真端口的配置数据。
⑴Win32环境
为了使用户能访问个端口的配置数据, 传真客户应用程序在调用 FaxOpenPort函数时,必须指定正确的传真端口访问级别。FaxOpenPort 返回传真端口句柄并根据指定的访问级别打开端口。应用程序根据用户的需求和许可,可查询下列值:
值 意义
PORT_OPEN_QUERY 调用FaxGetPort、 FaxEnumPort和FaxGetDeviceStatus 函数查询传真端口信息的端口访问级别
PORT_OPEN_MODIFY 调用FaxSetPort 函数修改传真端口配置的端口访问级别,默认为是与PORT_OPEN_QUERY访问级别联系的访问权限。
除了要求端口用恰当的访问级别打开之外,传真服务也要求用户查询并且修改端口数据时,要有恰当的访问权限。要获得传真端口句柄和查询端口数据,用户必须获得FAX_PORT_QUERY许可;要修改端口数据,用户必须获得 FAX_PORT_SET 许可。
传真客户应用程序可以调用 FaxAccessCheck函数查询用户的访问权限。也可使用微软管理控制台( MMC )插件组件之一的传真服务管理应用程序来修改用户端口访问权限。
⑵COM实现环境
在应用程序调用修改FaxPort属性的方法之前,须调用 IFaxPort::get CanModiFy方法(检索 V B 中FaxPort对象的CanModify 属性)以确保客户有权修改端口的配置。
2.1.7、传真客户程序的用户访问权限
传真服务是一种安全的服务。在 Win32 环境下,用户必须拥有访问权限以成功调用某一传真客户程序函数,每次客户程序调用传真客户程序函数前服务均进行访问权限检查。应用程序可以由调用 FaxAccessCheck 函数来检查用户的访问权限,。
如果使用微软®的 COM 实现,则此时传真客户应用程序无法获得该项功能。若客户没有执行特定任务的访问权限,则方法或函数失败且返回HRESULT_FROM_WIN32 ( ERROR_ACCESS_DENIED )。
微软管理控制台( MMC )插件组件之一传真服务管理应用程序,为用户提供查询和修改作业访问权限、端口访问权限和全局配置数据访问权限。
下面就详细叙述传真访问权限的内容。
2.1.7.1、特定传真访问权限
如果使用微软 COM 实现,则此时传真客户应用程序无法利用此项功能。
传真服务客户API 定义下列特定访问权限,为用户查询和管理传真作业、传真设备和传真文档提供安全保障。
值 意义
FAX_CONFIG_QUERY 允许在传真服务器级查询配置和路由方法数据
FAX_CONFIG_SET 允许在传真服务器级修改配置和路由方法数据
FAX_JOB_MANAGE 允许在程序中终止传真作业或改变传真作业队列的状态
FAX_JOB_QUERY 允许查询队列中和活动传真作业
FAX_JOB_SUBMIT 允许发送传真到一个或多个接收者
FAX_PORT_QUERY 允许在端口级查询配置、状态和路由算法数据;此访问权限有获取和关闭传真端口句柄的能力
FAX_PORT_SET 允许在端口级修改配置和路由方法数据;此权限有启用或屏蔽传真路由算法的能力
2.1.7.2、通用传真访问权限
如果使用微软 COM 实现,则此时传真客户应用程序无法利用此项功能。
传真服务客户API 定义下列通用传真访问权限,公共权限默认用户有特定传真访问权限:
值 意义
FAX_READ 包含由由特定访问权限FAX_JOB_QUERY、FAX_CONFIG_QUERY 和 FAX_PORT_QUERY认可的只读权限
FAX_WRITE 此访问等同于FAX_JOB_SUBMIT特定访问权限认可的许可。注意此权限不包括在端口或服务器级修改数据许可。
FAX_ALL_ACCESS 包括由下列特定访问权限认可的所有的读写许可: FAX_CONFIG_QUERY、 FAX_CONFIG_SET、FAX_JOB_MANAGE、FAX_JOB_QUERY、FAX_JOB_SUBMIT、FAX_PORT_QUERY和FAX_PORT_SET
2.1.7.3、函数要求的传真访问权
下列表格列出了win32环境下,用户成功地调用某个传真客户函数后可获得的访问权限。
访问权限 函数
FAX_CONFIG_QUERY(传真配置查询) FaxEnumGlobalRoutingInFo
FaxGetConFiguration
FaxGetLoggingCategories
FAX_CONFIG_SET(传真配置设置) FaxSetConFiguration
FaxSetGlobalRoutingInFo
FaxSetLoggingCategories
FAX_JOB_QUERY(传真作业查询) FaxEnumJobs
FaxGetJob
FaxGetPageData
FAX_JOB_SET(传真作业设置) FaxAbort
FaxSetJob
FAX_JOB_SUBMIT(传真作业提交) FaxSendDocument
FaxSendDocumentForBroadcast
FAX_PORT_QUERY(传真端口查询) FaxClose
FaxEnumPorts*
FaxEnumRoutingMethods
FaxEnumRoutingMethods
FaxGetDeviceStatus*
FaxGetPort*
FaxGetRoutingInFo
FaxOpenPort
FAX_PORT_SET(传真端口设置) FaxEnableRoutingMethod
FaxSetPort*
FaxSetRoutingInFo
*此函数要求特定传真端口访问级。
注意:FAX_JOB_MANAGE 访问级别允许用户调用FaxAbort 函数和FaxSetJob 函数。 2.1.8、传送传真
传送输出传真有以下要点:
⑴文档文件。传真服务转换数据为传真的标签图象文件格式F类格式(TIFF 6.0 F类)。
⑵发送信息。该信息包括传真序号、发送者和接收者数据、可选的账单编码方式以及作业安排信息。在 Win32 环境下,如果将应用程序打印到设备上下文,则FAX_PRINT_INFO结构会包含此信息否则由FAX_JOB_PARAM 结构包含信息。如果使用微软®COM 实现方式,可以设置 FaxJob对象的多重属性来指定发传信息。
⑶可选封面页文件。在 Win32 环境下,FAX_COVERPAGE_INFO 结构包含此数据,该结构提供封面页模板文件名 (.cov)及用户自定义的模板信息。如果使用微软®COM 实现,可设置FaxDoc对象的多重属性来指定封面页息。
2.1.9、封面页
封面页是一个封面页模板文件( .cov )和传真传送时提供给模板的用户自定义信息。
传真服务客户 API 支持封面页打印。封面页可为存储在本地计算机上的个人封面页文件,或为存储在传真服务器上存储的公共封面页。要获取封面页,用户必须提供应封面页文件的完整合法路径或公共封面页文件的相对路径。
典型情况下,管理器将公共封面页文件存储在如下的位置:
/SERVERNAME/FAX$/Coverpg
在个人计算机系统上,公共封面页文件存储于:
CSIDL_APPDATA/MicrosoFt/Windows NT/MSFax/coverpg
用户能够通过使用传真控制面板应用程序来添加个人封面页文件,但此文件必须存储于用户“我的文档”标准文件夹的如下位置:
CSIDL_PERSONAL/Fax/Personal Coverpages
此外,在 Win32 环境下,如果用户要指定一个公共封面页文件,就必须设置 FAX_COVERPAGE_INFO结构的UseServerCoverPage 成员为真。而在COM 实现环境下,则须设置FaxDoc对象的ServerCoverpage属性为真。
一个传真客户应用程序可以调用 FaxPrintCoverPage 函数将封面页打印到传真打印机设备上下文。
2.1.10、传真路由方法
传真路由方法是由传真路由扩展动态链接库(DLL)定义的一种程序。当传真端口收到输入传真时,按照优先级顺序执行传真路由方法。
由于以下原因,我们需要使用GUID来确定传真路由方法:
⑴一个传真路由扩展DLL可以支持多个路由方法。
⑵一个传真路由扩展DLL 可以为每个路由方法和传真设备提供唯一的配置数据。
⑶多重传真路由扩展 DLLs可用相同的名字输出路由方法。
2.1.11、传真客户API编程任务
下面我们就具体描述在传真客户应用程序中,要求合并传真服务客户 API功能的典型任务。
2.1.11.1、win32传真客户编程任务
以下步骤总结了在win32编程环境下,编写一份传真客户应用程序需要合并传真服务客户API功能的典型编程任务。
⑴调用FaxconnectFaxsever函数连接到传真服务器。注意除非服务器是本地计算机,否则应用程序必须提供服务器名。
⑵必要时,可调用一个或多个传真服务枚举函数。这些函数允许用户查看与传真服务器相连的传真端口和与端口相连的路由信息,也允许用户查看活动传真作业列表。这些枚举函数包括FaxEnumGlobalRoutingInFo、 FaxEnumJobs、 FaxEnumPorts和FaxEnumRoutingMethods函数。
⑶调用FaxOpenPort函数获取传真端口句柄。
⑷必要时,可调用FaxGetRoutingInFo、FaxSetRoutingInFo和FaxEnableRoutingMethod函数之一或多个来查询和修改传真端口的路由信息。
⑸可以调用FaxSendDocument或 FaxSendDocumentForBroadcast 函数来传送传真文件。注意应用程序必须提供诸如传真序号和接收者数据之类的传送信息。
⑹调用FaxFreebuFFer函数来释放应用程序调用FaxCOMpletejobparams函数以及Faxenum或Faxget开始的函数时所分配的资源。
⑺分两次调用FaxClose 函数。第一次调用断开应用程序与传真端口的连接,第二次调用则断开应用程序与传真服务器的连接。
此外,应用程序需要调用其它函数来查询设备或服务器配置数据、管理传真作业以及打印传真。
2.1.11.2、在C/C++程序中使用 COM 实现
以下步骤总结了COM实现环境下,用C/C++编写一份传真客户应用程序需要合并传真服务客户API功能的典型编程任务。
⑴调用CoCreateInstance函数创建一个FaxServer对象实例,然后调用IFaxServer::Connect 接口方法连接到活动传真服务器。
⑵调用下列iFaxsever接口方法中的一个或多个来创建所需对象:
a.调用IFaxServer::GetJobs 方法创建一个 FaxJobs对象,然后使用此对象创造 FaxJob 对象并枚举与所连结传真服务器的相关传真作业。
b.调用IFaxServer::Getports方法创建一个 Faxports对象,然后使用此对象创造 Faxport 对象并枚举与所连结传真服务器的相关传真端口配置信息。
c.调用IFaxServer::CreateDocument方法创建一个Faxdoc对象,然后使用此对象来发送传真以及检索和设置Faxdoc对象属性。
⑶在为特定端口创建FaxPort对象实例之后,即可调用 IFaxPort::GetRoutingMethods 接口方法创建FaxRoutingMethod对象,当然也可调用IFaxRoutingMethods::get_Item 接口方法创建FaxRoutingMethod对象。FaxRoutingMethod对象允许程序员查询和修改传真端口的传真路由信息。
⑷调用IFaxPort::GetStatus接口方法即可创建Faxstatus对象,该对象允许程序员提供关于端口的实时状态信息。
⑸在创建好Faxdoc对象实例之后,就可以调用IFaxDoc::Send 接口方法来发送一份传真文件。注意,应用程序必须提供诸如传真序号和将发送文件的名称之类的信息。用户也能通过设置Faxdoc对象的多种属性来提供其它需要显示在封面页上的数据。
⑹调用sysFreestring函数即可释放以get_PropertyName结束的所有接口方法分配的资源。
⑺调用IFaxServer:
isconnect 接口方法终止与传真服务器的连接,然后调用IUnknown::Release 方法释放FaxServer 对象自身。
此外, 要查询设备或服务器配置数据、管理传真作业和销毁附加接口指针应用程序需要调用其它接口方法,而用户若要检索传真服务已发送或接收的文件信息则需创建一个FaxTiFF 对象实例及调用IFaxTiFF接口方法。
注意客户应用程序必须调用CoCreateInstance函数来创建FaxServer 或 FaxTiFF对象的实例。但是,不能调用CoCreateInstance函数来创建 FaxDoc 、 FaxJobs 、 FaxJob 、 FaxPorts 、 FaxPort 、 FaxStatus 、FaxRoutingMethods或FaxRoutingMethod对象。
2.1.11.3、在VB程序中使用 COM 实现
以下步骤总结了COM实现环境下,用VB编写一份传真客户应用程序需要合并传真服务客户API功能的典型编程任务。
⑴调用VB的CreateObject函数创建一个FaxServer对象实例,然后调用对象的Connect方法连接到活动传真服务器。
⑵可调用下面FaxServer对象方法的一个或多个来创建所需的其它对象:
a.调用GetJobs方法创造一个 FaxJobs对象后,即可使用该对象创建FaxJob对象和枚举与所连接传真服务器相关的传真作业。
b.调用GetPorts方法创建一个 FaxPorts对象后,即可使用该对象创建 FaxPort对象和枚举所连接传真服务器的传真端口配置信息。
c.调用CreateDocument后方法创建一个 FaxDoc对象,即可使用该对象来传送传真以及检索和设置 FaxDoc对象属性。
⑶为特定端口创建一个FaxPort对象实例后,调用该对象的GetRoutingMethods方法即可创建FaxRoutingMethods对象。
⑷调用 FaxRoutingMethods 对象的Item方法即可创建FaxRoutingMethod对象,该对象允许用户查询和修改传真端口的传真路由信息。
⑸调用FaxPort对象的 GetStatus方法可以创建FaxStatus对象,该对象允许用户提供实时的传真端口状态信息。
⑹创建好FaxDoc对象的实例后,即可调用对象的Send方法传送一份传真文件。注意应用程序必须提供诸如传真序号和传送文件名之类的信息。客户也可以通过设置 FaxDoc 对象的不同属性,提供在封面页上出现的其它数据。
⑺调用FaxServer对象的Disconnect方法可终止与服务器的连接。
此外,要查询服务器和设备配置参数以及管理传真作业应用程序就需要设置其它的属性和调用其它方法,而用户若要检索有关传真服务已经收发文件的信息则需创建一个FaxtiFF对象实例来完成该任务。
2.1.12、连接到传真服务器
大多数情况下,传真客户应用程序在使用传真特性前必须连接到传真服务器。
⑴ win32环境
要连接到传真服务器,传真客户应用程序在调用其它任何传真客户函数前,必须首先成功调用 FaxConnectFaxServer 函数。该函数返回调用其它传真客户函数所要求的传真服务器句柄。
注意,到传真服务器的连接并不要求把传真文档打印到传真打印机设备上下文。程序能直接给传真客户图形设备接口( GDI )函数提供传送信息,并通过打印到打印机设备上下文来传送活动文档。传真客户GDI函数包括FaxStartPrintJob和FaxPrintCoverpage函数。
调用FaxClose函数断开到传真服务器的连接并释放FaxConnectFaxServer函数返回的句柄。
⑵COM实现环境
在C/C++应用程序中,开发者须调用CoCreateInstance函数来检索指向IFaxServer接口的指针并创建一个FaxServer对象实例。随后调用IFaxServer::Connect方法初始化与活动传真服务器的连接。在应用程序可以访问以iFax开始的大多数接口之前,要求其必须连接到服务器。(若访问iFaxtiFF接口则不必连接到传真服务器。)
在vb应用程序中,开发者则须调用vbCreateObject函数创建一个 FaxServer 对象实例,然后调用FaxServer对象的Connect方法初始化与活动传真服务器的连接。在应用程序可以访问以Fax开始的大多数对象之前,要求其必须连接到服务器。(若访问FaxtiFF接口则不必连接到传真服务器。)
2.1.12、传真服务器配置管理
传真服务客户 API支持对传真服务器配置数据进行改变,并提供服务器级别的配置选项。
2.1.12.1、管理全局配置数据
必须与活动传真服务器连接才能检索和改变其配置信息,这些信息包括对传送、标记、存档和封面页的设置以及贴现率周期和传真服务器状态队列。
⑴. Win32环境下
FaxGetConFiguration 函数允许传真客户应用程序查询传真服务器的全局配置设置。函数在FAX_CONFIGURATION 结构中返回查询信息。
FaxGetConFiguration函数分配FAX_CONFIGURATION 结构所要求的内存,因此应用程序必须调用FaxFreeBuFFer函数来释放已分配的资源。应用程序可调用 FaxSetConFiguration 函数,来修改传真服务器的全局配置设置。
注意;应用程序在调用 FaxGetConFiguration函数和FaxSetConFiguration函数前,须先调用 FaxConnectFaxServer函数以获取传真服务器的句柄。
⑵.COM实现环境
在检索和设置有关FaxServer 对象的信息前,须先连接到活动的传真服务器。
C/C++应用程序中,可使用 IFaxServer 接口的属性方法检索和设置 FaxServer对象的全局信息;vb应用程序中,可直接检索和设置 FaxServer对象的属性。
2.1.12.2、管理日志分类
当前此功能仅在Win32 环境下可用;对 COM 实现环境则不可用。
日志分类决定错误类型或传真服务器记载在应用程序事件记录文件中的其它事件类型。日志等级描述传真服务器记载的事件严重性的轻重。FaxGetLoggingCategories函数允许传真客户程序查询传真服务器的当前日志分类。函数会在一个或多个的FAX_LOG_CATEGORY结构中返回查询信息,每个结构描述一个当前日志分类。数据包括记日志分类的描述名、分类序号和当前日志级别。由FaxGetLoggingCategories 函数分配 FAX_LOG_CATEGORY结构所要求的内存,因此应用程序必须调用FaxFreeBuFFer函数来释放这些资源。应用程序可通过调用 FaxSetLoggingCategories函数,来修改传真服务器的全局配置设置。
注意:在调用 FaxGetConFiguration函数和 FaxSetConFiguration函数前,应用程序必须先调用 FaxConnectFaxServer函数以获得传真服务器句柄。
2.1.13、传真设备管理
传真服务客户 API 支持对传真路由和设备配置数据进行改变,并提供端口级别的配置选项信息。
2.1.13.1、查询传真端口数据(Win32 环境)
传真客户应用程序调用FaxEnumPorts函数即可显示目前所有与传真服务器相连接的传真设备,而若要查询单独的传真设备,则须调用FaxGetPort 函数。两函数通过FAX_PORT_INFO 结构返回详细的设备信息,一台设备对应一个结构。数据包括永久线路标识符、当前端口的状态和兼容性。注意:应用程序在调用 FaxGetPort函数之前须先调用 FaxOpenPort函数并指定PORT_OPEN_QUERY端口的访问级,。
可以调用 FaxGetDeviceStatus 函数,来显示与当前传真服务器连接的某台传真设备的状态,函数在 FAX_DEVICE_STATUS 结构中返回数据。结构包括当前设备状态标志位、设备及其位置标识符、发送和接收者名以及传真路由信息。
注意应用程序在调用 FaxEnumPorts 函数前,必须先调用 FaxConnectFaxServer 函数以获得传真服务器句柄;而应用程序在调用FaxGetDeviceStatus函数和FaxGetPort 函数前,须先调用 FaxOpenPort 函数指定 PORT_OPEN_QUERY端口的访问级别并获得传真端口句柄。
因为以FaxGet 和 FaxEnum 开始的函数会分配数据缓冲区所要求的内存,故应用程序必须调用 FaxFreeBuFFer 函数以释放这些资源。
应用程序可以调用 FaxSetPort 函数来修改一台传真设备的配置设置。
2.1.13.2、查询传真端口数据(COM实现)
FaxPort对象为传真客户应用程序提供查询端口和端口当前状态的永久线路标识符,也可以检索分配到端口的优先传送权。在端口响应调用前,输入传真调用的响铃处于等待状态,而不论当前端口是否启用传送和接受传真。
创建FaxPort对象实例后,即可调用 IFaxPort::GetStatus方法(VB 中用 FaxPort 对象的Status方法)创建FaxStatus 对象。使用 FaxStatus 对象检索父FaxPort对象的实时状态信息。
调用FaxPort::GetRoutingMethods方法创建FaxRoutingMethods 对象。(VB中用FaxPort对象的GetRoutingMethods方法)然后能使用此对象创建一个 FaxRoutingMethod对象实例。使用FaxRoutingMethod对象可为连结到传真服务器上的传真端口检索传真路由配置信息。
在C/C++应用程序中,在为指定的传真创建FaxPort对象以后,可以调用IFaxPort接口方法来检索端口的属性;而VB应用程序中,为指定的传真端口创建FaxPort对象以后,即可检索端口的多个属性。
2.1.13.3、修改传真端口数据
传真客户应用程序能修改传真端口的某个配置数据,这些数据包括分配到端口的传送优先权和端口响应调用前输入传真调用须等待的振铃次数,还包括端口的当前状态和功能以及传送和调用位置的标识符。
⑴WIN32环境下
传真客户应用程序可以调用 FaxSetPort 函数来改变与传真服务器相连接的传真端口的配置。
注意;应用程序在调用 FaxSetPort函数之前,须先调用 FaxOpenPort以指定 PORT_OPEN_MODIFY端口访问级别来获得传真端口句柄。
⑵.COM实现环境
创建FaxPort对象的实例后,可调用IFaxPort::GetRoutingMethods方法(VB 中可调用 FaxPort对象的GetRoutingMethods方法)来创建FaxRoutingMethod对象。此对象随后被用来创建FaxRoutingMethod 对象的实例。使用 FaxRoutingMethod 对象可在特定传真端口上启用或屏蔽传真路由方法。
注意,在应用程序调用修改FaxPort属性的方法前,可先调用IFaxPort::get_CanModiFy方法(在VB中是检索FaxPort对象的CanModify属性)确认客户程序有权修改端口配置。
C/C++的应用程序中,在为指定传真端口创建FaxPort对象后,即可调用IFaxPort接口方法来改变端口的属性。
VB的应用程序中,在为指定传真端口创建FaxPort对象后,就能马上检索对象的多种属性。
2.1.14、管理传真路由数据
一些路由方法属性,如方法优先权,可在传真服务器级设置并适用于所有连接到传真服务器的端口,而其它的传真路由方法属性在端口级设置。
下面就详细讨论管理传真路由数据的有关内容。
2.1.14.1、管理全局传真路由数据
当前,此功能仅在Win32 环境可用,在 COM 实现环境不可用。
一个传真客户应用程序可以调用 FaxEnumGlobalRoutingInFo 函数来查询全局路由方法数据,函数在FAX_GLOBAL_ROUTING_INFO结构中返回数据,返回信息包括传真路由方法的优先权和输出此路由方法的 DLL名,还包括 GUID 和确定传真路由方法的函数名以及方法的友好用户名。
应用程序调用FaxEnumGlobalRoutingInFo函数为FAX_GLOBAL_ROUTING_INFO结构来分配所要求的内存,因此程序须调用FaxFreeBuFFer函数来释放已分配的资源。
程序调用FaxSetGlobalRoutingInFo 函数修改全局路由方法数据。(当前路由方法优先权是应用程序能修改的唯一全局值。)
注意:应用程序在调用FaxEnumGlobalRoutingInFo函数和FaxSetGlobalRoutingInFo函数前,必须首先调用 FaxConnectFaxServer 函数以获得传真服务器句柄。
2.1.14.2、管理单独端口的传真路由数据(WIN32环境)
传真管理应用程序可以调用 FaxEnumRoutingMethods 函数来显示与特定设备相关联的所有传真路由方法;调用 FaxGetRoutingInFo函数来查询与设备相关联的单个方法。两个函数都由FAX_ROUTING_METHOD 结构返回调用的详细信息,每个结构对应一种方法。返回数据包括传真路由方法是否被启用的指示和输出路由方法的 DLL名,还包括GUID 和唯一确定路由方法的函数名及方法的友好用户名。
程序调用FaxSetRoutingInFo函数即可改变特定传真路由方法的路由数据。
注意:应用程序在调用FaxEnumGlobalRoutingInFo函数、FaxSetGlobalRoutingInFo函数和FAXGETROUTINGINFO前,须先调用 FaxOPENPORT函数以获得传真服务器句柄。由于以FAXGET和FAXENUM开始的函数为数据缓存分配内存,故应用程序须调用 FaxFreeBuFFer 函数来释放这些资源。
2.1.14.3、管理单独端口的传真路由数据(COM实现)
除了在特定传真端口上启用或屏蔽传真路由方法,传真客户应用程序还可以检索有关方法的数据,这些数据包括输出方法的DLL名、GUID 和唯一指定路由方法的函数名以及方法的友好用户名。
C/C++程序中,在指定端口为传真路由方法创建FaxRoutingMethod 对象后,即可调用 IFaxRoutingMethod接口方法。这些方法能检索路由方法的属性并在端口上启用或屏蔽一个路由方法; VB应用程序中,在指定端口为传真路由方法创建FaxRoutingMethod 对象后,即可检索对象的多种的性质。当然也可以在端口上启用或屏蔽一个路由方法。
2.1.14.4、启用或屏蔽传真路由方法
传真路由方法是每次在端口上收到传真后执行的行为。传真服务仅执行发送输入传真时端口启用的路由方法。
⑴Win32 环境
传真客户应用程序可以调用 FaxEnableRoutingMethod 函数为特定传真设备启用一个传真路由方法,也能调用函数来屏蔽因调用FaxEnableRoutingMethod或传真服务管理应用程序而启用的路由方法。应用程序调用FaxEnumRoutingMethods函数来查询当前传真路由方法是否启用。
注意,在调用FaxEnableRoutingMethod 或FaxEnumRoutingMethods前,应用程序须先调用FaxOpenPort 函数以获得传真端口句柄。
⑵COM的实现环境
C/C++应用程序中,可调用IFaxRoutingMethod:
ut_Enable属性方法在特定端口上启用或屏蔽传真路由方法。若要启用传真路由方法,传真客户程序须传递“真”值到IFaxRoutingMethod:
ut_Enable方法。IFaxRoutingMethod::get_Enable方法为FaxRoutingMethod对象检索Enable属性。在创建FaxRoutingMethod 对象前,须为FaxPort 对象检索指向IDispatch 接口的指针; vb程序中,可以设定 FaxRoutingMethod 对象的Enable属性,从而在特定端口启用或屏蔽传真路由方法。如果此属性为“真”,则端口启用路由方法。不过在创建FaxRoutingMethod对象以前,须先创建一个FaxPort对象实例。
2.1.15、传送传真
传真客户应用程序可以传送任何一个文件,但文件必须是正确的注册文件类型,同时传真服务器必须能够访问该文件。
2.1.15.1、发送一个封面页
传真服务客户API支持打印可选封面页,客户端能在传真文档中传送一个公共封面页或者是私人封面页.
如果要求发送一个封面页,则用户必须提供完整的封面页文件路径,或公共封面页文件的相对路径。
⑴发送封面页(win32环境下)
可以在发送传真时传送服务器上的个人或公共封面页。要传送封面页就须调用FaxSendDocument函数或FaxSendDocumentForBroadcast函数。
当调用FaxSendDocument函数传送传真,必须提供指向FAX_COVERPAGE_INFO 结构的指针。该结构提供了封面页模板文件名和文件位于本地或传真服务器的指示,结构同时也提供用户支持的封面页信息。
a、发送公共封面页
①调用FaxSendDocument 函数时,提供指向FAX_COVERPAGE_INFO结构的指针。
②设定FAX_COVERPAGE_INFO结构的UseServerCoverPage成员为真。
③在FAX_COVERPAGE_INFO结构的UseServerCoverPage成员指定有效的公共封面页文件.
b、发送一个个人封面页
①调用FaxSendDocument函数时, 提供指向FAX_COVERPAGE_INFO结构的指针。
②设定FAX_COVERPAGE_INFO结构的UseServerCoverPage成员为假。
③指定一份传真服务器在FAX_COVERPAGE_INFO结构的CoverpageName成员中访问的有效个人封面页文件。
可以调用FaxGetConFiguration 函数确定传真服务器是否允许设置个人封面页。如果应用程序调用FaxSendDocumentForBroadcast函数传送一份传真到多个的接收者,此函数就须调用 FAX_RECIPIENT_CALLBACK函数。而在调用FAX_RECIPIENT_CALLBACK及设置上文提及的成员时,程序必须提供一个指向 FAX_COVERPAGE_INFO 结构的指针。回调函数能为每个特定传真接收者检索指定用户的封面页信息。
⑵发送封面页(COM实现环境)
通过设定以下的FAXDOC对象属性,即可在传真中发送公共封面页或个人封面页.
a、发送公共封面页
①设定SENDCOVERPAGE属性为真。
②设定SERVERCOVERPAGE属性为真。
③设定封面页名属性为有效公共封面页文件。
b、发送个人封面页
①设定SENDCOVERPAGE属性为真。
②设定SERVERCOVERPAGE属性为假。
③设定封面页名属性为有效公共封面页文件。
可调用IFaxServer::get_ServerCoverpage方法来确定传真服务是否允许设置个人封面页。
要在传真中传送封面页,可以调用 IFaxDoc::Send 方法(VB中是FaxDoc对象的Send方法)。
2.1.15.2、发送传真到一个接收者(WIN32环境)
传真客户应用程序调用 FaxSendDocument函数来指定存储于磁盘上的文件,从而排列将要发送到一个接受者的传真作业。
程序必须指定传送文件并提供指向 FAX_JOB_PARAM 结构的指针。传真服务器将根据FAX_JOB_PARAM指定的细节来排列传真作业。该结构包括接受者的传真号码、发送和接受的数据、可选账号和作业排列信息。
要发送一份封面页,应用程序必须提供一个指向 FAX_COVERPAGE_INFO 结构的指针,此结构包含将显示在传真封面页上的数据。
程序在调用FaxSendDocument 函数前须先调用 FaxCOMpleteJobParams 函数。FaxCOMpleteJobParams函数为 FAX_COVERPAGE_INFO和FAX_JOB_PARAM 结构的成员提供数据。调用FaxFreeBuFFer 函数来释放与这些结构关联的内存。
要有效地将一份传真文件发送到若干接收者,应用程序应该调用 FaxSendDocumentForBroadcast 函数,而非多次调用FaxSendDocument 函数。注意:应用程序在调用 FaxSendDocument 函数和 FaxSendDocumentForBroadcast 函数前须先调用 FaxConnectFaxServer 函数以获得传真服务器句柄。
2.1.15.3、发送一份传真到一个接收者(COM实现环境)
如果程序使用传真客户COM 实现,除非用现存的连接线路来设置属性以启用传真发送,传送一份传真需要有FileName属性和FaxNumber 属性,。传送传真时,用户也可以指定其它的可选属性,如封面页设置、传真接收和发送者信息以及一些仅在封面页显示的数据。
C/C++应用程序中,在与活动传真服务器连接好以后,即可调用 IFaxServer::CreateDocument方法创建一个 FaxDoc对象。随后调用多种IFxDoc接口方法来设置对象的可选或必须属性。最后调用 IFaxDoc::Send 方法来传送文件。
在VB应用程序中,调用VB中的CreateObject 函数创建一个FaxServer对象。然后调用该对象的 CreateDocument 方法创建一个 FaxDoc 对象,并设置FaxDoc对象的必须和可选属性。最后调用FaxDoc对象的Send方法发送传真文件。
2.1.15.4、广播传真到多个接收者
当前此功能只在WIN32环境下可用,而COM环境下不可用。
FaxSendDocumentForBroadcast 函数排列传真作业,这些作业把存储在磁盘上的文件传递到多个接受者。程序必须指定要传送的文件。一旦指定了传真接收者,FaxSendDocumentForBroadcast 函数就会多次调用 FAX_RECIPIENT_CALLBACK 函数来检索排列的信息,每次对应一个接收者,若有要求则信息也包含封面信息。
程序在调用 FAX_RECIPIENT_CALLBACK 函数前,须先调用FaxCompleteJobParams 函数。FaxCompleteJobParams 函数为 FAX_COVERPAGE_INFO 和 FAX_JOB_PARAM 结构的成员提供数据。可以调用FaxFreeBuffer 函数来释放与这些结构相关联的内存。
注意程序在调用 FaxSendDocument和FaxSendDocumentForBroadcast函数之前,必须先调用 FaxConnectFaxServer 函数来获得传真服务器的句柄。
2.1.15.5、传递传真到活动的输入调用
使用现存的输入线路连接来传递传真文件可以节约传真的费用,即所谓的"faxback 服务"。若要使用现存的输入线路连接成功传递文件, 调用须处于LINECALLSTATE_CONNECTED 状态。
⑴、WIN32 环境
若要使用现存的线路连接来传递传真,在调用FaxSendDocument 或 FaxSendDocumentForBroadcast函数时,需指定 FAX_JOB_PARAM 结构的CallHandle成员。调用句柄必须是TAPI LINE_CALLSTATE检索到的消息之一。如果指定CallHandle成员, 程序会使用现存的连接进行传真传递而不是初始化一个新调用。
⑵、COM 实现环境
C/C++ 程序中, 可设置 CallHandle或ConnectionObject 属性启用现存连接线路来传递传真。如果要传递传真到活动输入TAPI 2.x 调用,可以调用 IFaxDoc:
ut_CallHandle接口方法。若要在FaxDoc对象中存储TAPI调用对象的引用, 则须调用IFaxDoc:
utref_ConnectionObject方法。使用现存线路连接传递传真时,ConnectionObject属性提供基于COM的全部的功能。在VB程序中,可设置FaxDoc对象的ConnectionObject属性,在使用现存连接线路传递传真时,该属性提供基于COM的全部功能。
2.1.15.6、打印传真到设备上下文
当前此功能只在WIN32环境下可用,而COM环境不可用。
传真客户程序不要求到传真服务器的连接将传真打印至打印设备上下文(DC)。不必调用FaxSendDocument或FaxSendDocumentForBroadcast 函数, 程序可直接向传真客户服务API提供的图形设备接口函数(GDI)提供传递信息。这就使程序可以由直接打印到打印机DC来传递活动文本。传真客户的GDI 函数包括FaxStartPrintJob 和FaxPrintCoverpage 函数。
由于传真GDI函数使用传真打印机设备, 故调用FaxStartPrintJob 函数时,必须指定所连接的传真打印机名。打印机可为本地打印机如“printername”或远程打印机如“/machinename/printername”。若将NULL PrinterName 参数传递到FaxStartPrintJob,则指本地打印机,FaxStartPrintJob函数返回打印机DC的句柄。
注意:传真客户程序不应调用 CreateDC Win32 GDI函数来创建传真打印机DC,也不应调用 StartDoc打印函数来启动文本打印。相反,程序应调用FaxStartPrintJob函数。
打印传真到设备上下文的步骤:
(1)调用FaxStartPrintJob 函数检索传真打印机DC的句柄。函数在FAX_CONTEXT_INFO 结构中返回句柄。
(2)若传真要求有封面,可调用FaxPrintCoverpage函数来传递指向FaxStartPrintJob函数返回的FAX_CONTEXT_INFO结构的指针。
(3)以常规方式打印传真文档到打印机DC时,要给DC传递FaxStartPrintJob函数返回的句柄,此过程包括调用StartPage 和 EndPage Win32 GDI 函数。
(4)调用EndDoc或AbortDoc 函数,向FaxStartPrintJob函数返回的DC传递句柄,这将关闭文档和结束传真打印作业。
(5)调用DeleteDC函数释放分配到DC的句柄。
2.1.16、管理传真作业
传真服务客户API支持灵活的队列管理和活动传真作业管理。下面就详细描述输出传送的管理。
2.1.16.1、查询传真作业
传真客户程序可以查询与传真作业相关的传真序号、传真接收者和发送者信息,也可检索作业的类型、状态和唯一标示符;时序、作业顺序和传递页的数目。
⑴Win32 环境
FaxEnumJobs函数允许传真客户应用程序检索指定传真服务器上的传真作业队列列表。调用FaxGetJob函数可查询单独的传真作业。两个函数均可返回FAX_JOB_ENTRY结构中作业的详细信息,一个结构对应一个作业。
因为FaxEnumJobs和FaxGetJob函数为FAX_JOB_ENTRY结构分配其所要求的内存,故应用程序须调用 FaxFreeBuffer 函数来释放这些资源。
注意:应用程序在调用 FaxEnumJobs和FaxGetJob函数前,须先调用 FaxConnectFaxServer函数获得传真服务器句柄。
⑵COM实现环境
C/C++应用程序中,在为指定传真作业创建FaxJob对象后,可调用IFaxJob接口方法来查询作业的性质;在VB应用程序中,在为指定传真作业创建FaxJob对象后, 即可查询对象的多种性质。
2.1.16.2、显示传真作业队列中的文档
当前此功能仅在 Win32 环境可用;在 COM 实现环境不可用。
程序可调用FaxGetPageData函数来管理传真队列中的文档。函数以F类的标签图像文件格式(TIFF 6.0 Class F)返回传真数据的第一页。调用函数必须解码数据流。调用FaxFreeBuffer 函数可释放由FaxGetPageData函数分配的资源
2.1.16.3、修改传真作业
传真客户应用程序在传真作业被排序后,无法对传送传真的性质或属性进行修改。
⑴win32环境
传真客户应用程序在传真作业排序后无法对传真的性质进行修改,是因为许多与作业关联的FAX_JOB_ENTRY 结构所包含的属性在文本传送开始后是无法改变的。应用程序可以调用FaxSetJob函数来暂停、恢复、取消或重启队列传真作业。
注意:应用程序在调用FaxSetJob函数前须先调用FaxConnectFaxServer函数来获得传真服务器句柄。
⑵ COM实现环境
C/C++应用程序中,在创建FaxJob 对象后,即可调用IFaxJob::SetStatus 方法来暂停、恢复、取消或重启作业;在VB应用程序中,创建FaxJob 对象以后,可调用对象的 SetStatus 方法暂停、恢复、取消或重启作业。
2.1.16.4、终止传真作业
传真客户应用程序能终止正在传送中的传真。
⑴ Win32 环境下
传真客户应用程序能调用 FaxSetJob 函数或 FaxAbort 函数取消正在传送的传真。注意应用程序在调用 FaxAbort 函数或 FaxSetJob 函数前须先调用FaxConnectFaxServer函数来获得传真服务器的句柄。
⑵COM 实现环境
C/C++应用程序中,在创建 FaxJob 对象后,即可调用 IFaxJob::SetStatus方法终止传真作业,但必须在Command(命令)参数中指定JC_DELETE。vb应用程序中,创建 FaxJob 对象后,调用对象的SetStatus 方法,由指定JC_DELETE常数即可取消传真作业,但应注意的是,必须先定义这个常数。
2.1.17、释放传真资源
在某些情形下,调用传真客户应用程序可以管理分配资源,这对指 COM 实现环境的C/C++应用程序和Win32 环境的程序均适用。
⑴ Win32环境
传真客户应用程序必须调用特定的传真客户函数来释放资源。这包括调用FaxCompleteJobParams 函数和以FaxEnum 或 FaxGet开始的函数。调用 FaxFreeBuffer函数即可释放这些资源。如果应用程序已调用 FaxFreeBuffer函数解除引用,数据就不能再被引用。
⑵COM实现环境
C/C++应用程序中,必须调用SysFreeString 函数来释放与由所有pVal 参数指向的缓冲区相关联的资源。这是因为检索属性的所有属性方法(以get_PropertyName 结束)为缓冲区分配所要求内存。VB应用程序则不必释放资源。
2.1.18、断开与传真服务器的连接
只有调用传真客户应用程序才能断开与传真服务器的连接。
⑴Win32 环境
传真客户应用程序须在其被终止前调用 FaxClose 函数作为最后一个函数。函数由释放下列句柄从传真服务器断开调用程序:
a.调用FaxConnectFaxServer函数返回传真服务器句柄。
b.调用FaxOpenPort 函数返回传真端口句柄。
⑵COM实现环境
C/C++应用程序中,可调用IFaxServer:
isconnect 方法来终止与传真服务器的连接。然后调用 IUnknown::Release 方法使FaxServer对象释放自己。也可能需要再次调用IUnknown::Release 来肃清附加接口的指针。在VB应用程序中,在应用程序终止以前,须调用FaxServer 对象的Disconnect方法断开与传真服务器的连接。
2.1.19、通用传真客户编程任务
下面叙述开发传真客户应用程序所需的附加信息。
2.1.19.1、检查用户的访问权限
微软传真服务是一种安全的服务。传真服务管理应用程序,是一种微软管理控制台( MMC) 插件组件,使用户可以查询和修改作业、端口和全局的配置数据的权限。
⑴Win32 环境
用户要成功调用特定传真服务函数必须有特定的访问权限,可以调用FaxAccessCheck函数来查询用户的传真访问权限。
⑵COM实现环境
C/C++应用程序中,须保证客户有修改指定端口的权限。可以在调用以IFaxPort:
ut_开始的方法前,首先调用IFaxPort::get_CanModify 方法来指定传真端口。在VB应用程序中,可由检索 FaxPort对象的 CanModify性质决定用户是否有修改传真端口配置信息的权限。
2.1.19.2、启动应用程序接收传真事件通知
当前此功能仅在Win32 环境可用,在 COM 实现环境不可用。
调用FaxInitializeEventQueue函数为传真客户应用程序创建一个传真事件队列。队列使应用程序能够从传真服务器收到异步的事件的通知。应用程序能指定传真服务器如何通知事件的客户应用程序。应用程序能要求传真服务器按照I/O完备端口排列I/O完备包,或指定传真服务通知发送消息。
传真客户应用程序在一次传真服务期间,只能调用传真服务会议 FaxInitializeEventQueue函数一次(当服务发送 FEI_FAXSVC_STARTED 消息时,传真服务开始;传送 FEI_FAXSVC_ENDED 消息时传真结束)。这样就可以防止传真服务给客户计算机发送副本消息。如果在一次发送期间多次调用FaxInitializeEventQueue,函数会失败并返回错误代码ERROR_INVALID_DATA。在应用程序关闭传真服务器句柄后,传真客户应用程序还可以继续接收传真服务的传真事件。
⑴从传真服务收到通知消息
当前此功能仅在 Win32 环境可用,在 COM 实现环境不可用。
客户应用程序调用 FaxInitializeEventQueue函数时,使用通知消息而不是I/O 完备包来指定通知。应用程序会指定hWnd 参数的有效窗口句柄和MessageStart参数值来完成此工作。
传真服务调用PostMessage 函数发送通知消息到hWnd 参数中客户应用程序指定的目的地窗口。客户应用程序的窗口程序处理收到的消息。另外,开发者必须考虑下列的因素以保证客户应用程序能够收到通知消息。
a.在LocalSystem帐户下运行传真服务
传真服务和本地登录用户在不同的桌面上运行传真客户应用程序。因为通知消息不能跨越桌面,故控制面板的服务应用程序必须在本地计算机的 LocalSystem 帐号下使Allow Service To Interact With Desktop传真服务选项被选中。这就允许传真服务可以访问客户的桌面,并使服务能够给客户发送消息。
b.在用户帐户下运行传真服务
用户可以配置运行在用户帐户而不是LocalSystem 帐户下的传真服务,如激活MAPI 功能。这种状况下,Allow Service To Interact With Desktop(允许服务与桌面交互)选项将不被传真服务选中。要启用接收通知消息,传真服务须为传真客户应用程序打开访问标志。当客户调用 FaxInitializeEventQueue 函数时,服务打开标志并指定通知消息。当传真服务要传递消息到客户,服务模仿客户并发送消息到客户。开发者不需要在客户应用程序中合并任何代码来启用以上功能。
然而,当传真服务在用户帐号下面运行时,应用程序必须合并代码以使客户能够成功地注销。这是因为如果传真服务有客户桌面的打开句柄,用户就不能注销了。当客户应用程序收到 WM_ENDSESSION或 WM_DESTROY 消息时,必须再次调用FaxInitializeEventQueue 函数,指定初始时由 hWnd参数指定的同一窗口句柄。然而,程序必须在CompletionKey 参数里指定一个-1值来通知客户正在注销并且服务应该关上为客户打开道德访问标志,这就使得客户可以注销。注意:传真服务不需要在 LocalSystem 帐目下面运行以启用此特征。
为优化性能,当用户试图注销传真服务时,应使客户应用程序能决定传真服务是否正在运行。如果客户收到FEI_FAXSVC_ENDED 消息,则传真服务不在运行。由于服务关闭了为客户打开的访问标志,客户不再需要调用 FaxInitializeEventQueue 函数。
⑵从传真服务接收I/O完备包
当前此功能仅在Win32 环境可用,在 COM 实现环境不可用。
当客户应用程序调用FaxInitializeEventQueue 函数时,可用I/O 完备包来替代通知消息指定通知。应用程序由在 CompletionPort参数中把有效句柄传递给I/O 完备端口和传递CompletionKey 参数值来完成此项工作。如果应用程序指定 I/O 完备包,则传真服务不为应用程序打开标志。这种状况是没有必要附加编码的,因为完备包可以和桌面进行交互。传真服务调用 PostQueuedCompletionStatus 函数,通知异步的事件的客户。客户必须调用 GetQueuedCompletionStatus 函数来检索包含 FAX_EVENT 结构的I/O 完备包。
2.1.19.3、在传真客户应用程序中启用MAPI功能
传真服务支持与MAPI-aware集成的两个等级的客户应用程序:概要传递方法和电子邮件传递方法。当传真服务器发送或接收传真传送时,可以使用这些传递方法之一来传送传递报告(ndrs)和非传递报告( NDRs )。
传真服务可以不要求有传递报告,应用程序可指定没有非传送报告被发送。防止传送报告的传送方法如下:
a.Win32 环境
调用 FaxSendDocument 函数或 FaxSendDocumentForBroadcast 函数并在 FAX_JOB_PARAM 结构的 DeliveryReportType 项指定 DRT_NONE;或调用FaxStartPrintJob 函数并指定 FAX_PRINT_INFO 结构的DrProfileName和DrEmailAddress成员为NULL。
b.COM 实现环境
毋须设置 FaxDoc 对象的 EmailAddress 性质;也毋须设置 FaxServer对象的ServerMapiProfile性质。
⑴概要传递报告
当前此功能仅在 Win32 环境可用,在 COM 实现环境不可用。
如果系统有主要用户或系统不在网络中,则传真传送报告的概要传送方法 (DRs)及未传送报告( NDRs )是可行的。
传真客户应用程序能用下列方法之一请求DRs和 NDRs 的概要传送:
a.调用FaxStartPrintJob 函数并且在 FAX_PRINT_INFO 结构的 DrProfileName 成员中指定有效的MAPI 简介, DrEmailAddress成员一定要为空。
b.调用 FaxSendDocument 函数或 FaxSendDocumentForBroadcast 函数并在FAX_JOB_PARAM 结构的 DeliveryReportAddress成员中指定有效的 MAPI简介。也须指定DeliveryReportType成员的DRT_INBOX。
当传真服务器使用此方法传送报告时,在指定MAPI用户简介文件的默认消息存储位置放置报告,典型情况下,为用户本地个人信息存储的收件箱文件夹。
如果在网络环境中指定简介传送报告,缺省消息存储于微软®Exchange Server上的收件箱。传真服务器须允许对存储的默认消息读写,使用微软管理控制台插件组件Manage Computer/Services(计算机管理/服务申请)可以改变传真服务帐目。
⑵电子邮件传送报告
如果系统有多个用户或系统处于网络中,用传送传真的电子邮件传送方法传送报告(drs)和未传送报告( NDRs )是合适的方法的。一个多用户的例程是连结到一个或多个客户机的传真服务器系统。
电子邮件DRs和 NDRs 的传送,传真服务器要求有下列项目:
a.详尽的 MAPI简介,由此传真服务器产生电子邮件;
b.到微软®Exchange 服务器的连接;
c.传真服务器传送电子邮件到Exchange服务器的邮箱名或别名
请求电子邮件DRs和 NDRs传送, 传真客户程序必须执行以下 Win32 和 COM 实现的步骤。
a.Win32 环境
①调用 FaxSetConfiguration 函数并在FAX_CONFIGURATION 结构的 InboundProfile 成员指定有效的MAPI用户简介文件。传真服务必须能访问指定的简介文件(要求使用微软管理控制台插件组件Manage Computer/Services(管理计算机/服务器)程序改变传真服务帐目)。
②调用ChangeServiceConfig 函数改变传真服务帐号的配置参数(另外也可使用微软管理控制台插件组件系统服务管理应用程序来改变传真服务帐目) 。
③使用传真的微软管理控制台(MMC)插件组件服务监视应用程序重启传真服务或调用 StartService 函数。
④下列步骤之一可要求电子邮件DRs和 NDRs传送:
l 调用 FaxStartPrintJob 函数并指定 FAX_PRINT_INFO 结构的 DREmailAdDRess成员。指定的电子邮件地址必须是Microsoft Exchange 服务器全局地址列表(gal)中的有效地址名或别名;
l 调用 FaxSendDocument 函数或 FaxSendDocumentForBroadcast 函数并且在FAX_JOB_PARAM结构的 DeliveryReportAdDRess成员指定一个有效的电子邮件地址,同时也必须在 DeliveryReportType成员指定 DRT_EMAIL。
传真服务器由步骤①的InboundProfile成员指定的地址传送电子邮件的DRs或NDR到步骤④ 的DREmailAdDRess或 DeliveryReportAdDRess 成员指定的地址。
b.COM 实现环境
①设置FaxServer对象的 ServerMapiProfile性质,该性质必须指定有效的 MAPI简介文件。
②设置 FaxDoc对象的EmailAdDRess性质。电子邮件地址必须是Microsoft Exchange 服务器的全局地址表(gal)的一个有效地址名或别名。
以下步骤同Win32 环境。
服务器将从ServerMapiProfile性质指定的电子邮件地址传送电子邮件DRs或NDR送到EmailAdDRess 性质指定的电子邮件地址。
2.1.19.4、检索传真文件数据
当前此功能仅在COM实现环境可用,在Win32环境不可用。
传真服务变换处理的文件为F类传真的标签图象文件格式 ( TIFF6.0 F 类 )。服务在文件中嵌入定制的 TIFF 标签存储传真传播的信息。传真客户应用程序使用 FaxTiff 对象检索传真服务传送或接收的文件信息。
应用程序能查询FaxTiff 对象的性质。该性质包括设备和状态标识符、传真序号和发送者和接受者名字。在创建FaxTiff 对象的例程前,不需要提前创建一个 FaxServer对象。
C/C++应用程序中,为传真文件创建FaxTiff 对象后,即可调用 IFaxTiff 接口方法查询文件的性质; VB应用程序中,为指定文件的传真创建 FaxTiff 对象后,就能检索对象的多种性质。
2.1.19.5、传真路由扩展的本地注册
传真路由扩展能直接安装在传真服务器上 (本地安装)或从网络上的某台计算机安装(远程安装)。推荐使用本地安装。在本地注册传真服务推荐使用传真路由扩展DLL来施行下列步步骤非直接访问注册表。
a.拷贝路由扩展DLL到FaxRegisterRoutingExtension 函数的ImageName参数指定的地址。
b. 要获得到本地的服务器的传真服务器句柄,可调用 FaxConnectFaxServer 函数为MachineName参数指定一根NULL指针。
c.调用FaxRegisterRoutingExtension函数注册传真服务的路由扩展 DLL。函数在传真路由扩展 DLL中为每个传真路由方法调用一遍 FAX_ROUTING_INSTALLATION_CALLBACK 函数。
如果调用 FaxRegisterRoutingExtension 函数来安装传真路由扩展,必须使用该扩展输出的传真路由方法来重启传真服务。
2.1.19.6、传真服务供应商的本地注册
传真服务供应商能直接安装在传真服务器 (本地安装)或网络计算机(远程安装) 上。但推荐用本地安装。
为了在本地注册传真服务,推荐传真服务供应商执行下列步骤而不是直接访问注册表。
a.为抽象设备安装电话服务供应商。电话服务供应商指定传真服务供应商控制的所有传真设备并使传真服务能够使用外部的传真设备。
b.拷贝服务供应商 DLL到FaxRegisterServiceProvider函数的ImageName参数指定的位置。
c.调用 FaxRegisterServiceProvider 函数为传真服务用户配置新设备及为传真服务供应商注册传真服务动态链接库( DLL )。
2.1.20、 使用传真客户COM实现
除了传真服务客户API Win32函数,微软®还为传真客户应用程序开发者提供了COM实现的接口。并为用VB、VBScript 、Jscript和Java工作的程序员提供双接口访问以及C/C++程序员提供VTable 访问,接口使用 ActiveX®模板库以提高性能并使要求大小减至最小。
本章,传真服务客户API简介,概述了Win32 环境与COM 实现环境下运行的传真客户程序之间的差别。
为C/C++开发者提供的COM 实现的参考材料是围绕单个COM 接口组织的;为vb开发者提供的COM 实现的参考材料是围绕传真客户对象模型组织的。
注意: C/C++程序不能实现以IFax 开始的任何接口;而 vb程序不能实现以Fax开始的任何类。微软标准实现会提供完整功能。要支持传真客户 COM 实现的功能, 要求有FaxCom.h和FaxCom.dll文件。
2.1.20.1、传真客户对象模型
大多数传真客户对象模型的对象以分层方式组织。但FaxTiff 对象除外,它是一个非标准对象。
下列图表说明此层次。可存在多个FaxJob、FaxPort和 FaxRoutingMethod对象
大多数传真服务器客户API的COM接口从本质上说是分层的。例如,客户应用程序在访问以IFax开始的接口或其它传真客户对象前,必须调用 IFaxServer::Connect 方法(或FaxServer 对象的Connect VB方法),建立与传真服务器的连接。(FaxTiff 对象为一个例外,连接的传真服务器不要求访问FaxTiff 对象)。
在客户应用程序通过RPC 建立到活动传真服务器的连接后,应用程序即可调用其它接口方法了。这是因为活动的 FaxServer 对象“知道”它连结的传真服务。例如,程序能调用下列方法之一:
a.调用IFaxServer::GetJobs 方法(或 FaxServer 对象的GetJobs VB方法)创建一个 FaxJobs 对象并检索与所连结的传真服务器关联的传真作业列表 。
b.调用FaxServer::GetPorts 方法(或 FaxServer 对象的 GetPorts VB 方法) 创建一个FaxPorts对象并检索与所连联接传真服务器关联的端口列表。
c.调用IFaxServer::CreateDocument 方法(或 FaxServer 对象的 CreateDocument VB 方法) 创建FaxDoc 对象并且传送一份传真。
客户应用程序不能调用CoCreateInstance 函数去创造这些对象或由其导出对象。
2.1.20.2、使用VB实现传真客户COM接口
VB程序员使用的传真服务客户API COM接口文档按照传真客户对象模型组织。每个对象文档都包括对象功能的详细描述列表,对象属性和方法列表,访问属性和调用对象方法的VB例程。
注意;相应的C/C++接口方法主题会包含VB 程序员感兴趣的信息。例如,这些等价主题提供相关联的话题间的交叉引用,并且包含详细的参数描述。C/C++接口方法名以IFax开始。
第三章 传真服务供应商应用程序接口
传真服务API允许将传真设备集成到微软传真服务中去。
本章的第一部分描述支持传真服务供应商API的组件及API功能,也包括虚拟传真服务和错误控制的简短讨论;最后,构画出传真服务供应商注册要求并且描述开发一个传真服务供应商活动链接库( DLL )的编程指南。
本章的第二部分包括怎样创建并发送传真服务供应商状态变化到传真服务的代码示例,同时也描述了怎样使用虚拟传真设备传送传真。
在阅读概述之前,应熟悉电话应用程序编程接口( TAPI )和微软电话服务供应商( TSPI )的有关概念。
3.1、传真服务供应商结构
下图提供了传真服务供应商环境的纵览:
必须在源代码文件中包含传真服务供应商头文件(FaxDev.h)
3.2、传真服务供应商 API 简介
传真服务供应商 API支持多个传真设备并且为实现传真提供独立设备接口。下列组件被要求支持传真服务供应商API功能。
a.传真设备制造商必须为传真服务提供已定义接口的传真服务供应商动态链接库( DLL )。每个传真设备系列至少要有一个传真服务供应商DLL。
b.传真服务( FaxSvc.exe )。这个支持服务的应用程序为传真服务供应商 DLL 提供执行上下文。传真服务用DLL同传真服务供应商进行通信。传真服务管理传真设备和配置数据,提供打印服务并传送和接收传真文件。传真服务为所有的传真文档创建F类传真标签图象格式的文件( TIFF 类 F )。
c.电话应用程序接口( TAPI )建立出、入传真的调用,并提供传真设备的细目、状态和通知变化。
d.仅提供物理传真设备的传真服务提供商也必须为电话服务供应商提供设备抽象。电话服务供应商确定传真服务供应商控制的所有传真设备,并使传真服务能够使用传真设备。如果传真服务供应商提供虚拟传真设备,则不需要一个电话服务供应商。
另外,必须在源代码文件包括传真服务供应商头文件FaxDev.h,该文件包含函数原型、结构定义和传真状态常数。传真服务供应商负责存储所有的客户接口特征和配置。
3.2.1、传真业务纵览
传真业务是传真操作的集合,传真操作包括发送和接收操作。在每次传真业务的开始,传真服务调用FaxDevStartJob为传真服务供应商执行调用安装提供机会并初始化一个新的传真业务。由于每个传真操作是在分开的线程执行所以传真服务也在每次传真操作开始时调用FaxDevStartJob函数。
下图显示了在传真发送操作时传真服务进行函数调用的顺序,传真服务供应商必须输出这些函数 。
传真服务在同步线程中依次调用以下函数:
a.FaxDevStartJob。 初始化传真业务和发出传真操作开始信号。
b.FaxDevSend (或 FaxDevReceive)。通知传真服务供应商初始化输出传真传递(或接收一个输入传真传递)。
c.FaxDevReportStatus。向传真服务供应商查询活动传真操作的状态信息。
d. FaxDevEndJob。关闭活动传真业务。
传真服务在发送或接收操作期间,在独立于传真操作的执行线程中异步调用FaxDevReportStatus 和FaxDevAbortOperation 函数, FaxDevAbortOperation会要求传真服务供应商终止对活动操作。
3.2.2、初始化传真服务供应商
每次传真服务开始时,会调用TAPI lineInitializeEx 函数来检索线路上可获得设备的数目。在初始化期间,传真服务检查FaxDevVirtualDeviceCreation函数的传真服务供应商DLL。如果供应商输出可选函数FaxDevVirtualDeviceCreation,传真服务会期望传真服务供应商提供一个或多个虚拟传真设备。
传真服务也在每次服务开始初始化服务与传真服务供应商DLL间的通信时调用 FaxDevInitialize函数 。当传真服务调用FaxDevInitialize时,通过提供函数指针,传真服务供应商必须注册T FAX_LINECALLBACK 函数。 服务调用FAX_LINECALLBACK 以为传真服务供应商传递TAPI事件。传真服务