设为首页 友情链接
在线留言 发表文章
加入收藏 广告联系

刺猬首页

| 专案技术 | 网络技术 | 图形图象 | 网络编程 | 网页设计 | 操作系统 | 服务器 | 技术白皮书 | 在线实验室 | 刺猬论坛 |
小说专版  | 数据库 | 设计赏析 | 存储频道 | 网络安全 | 私服架设 |  Solaris | 网站评估 | PC维护技巧 | 下载中心 | 博 客 |
专   题: | Linux | java | cisco | 防病毒 | 刀片 | SOA | iscsi | ASP.NET | SQL | Oracle |
您现在的位置: IT公社 IT community >> Linux专题 >> Linux应用技巧 >> 教程正文 用户登录 新用户注册
专 题 栏 目
最 新 热 门
最 新 推 荐
相 关 文 章
Linux中的Ftp客户端──…
Linux操作系统下APE格式…
教你在Linux操作系统下也…
配置VNC 使window下vnc访…
浅谈Linux操作系统KDE桌…
在Linux操作系统下用Win…
linux虚拟光驱介绍
用语言控制Linux:Linux…
用语言控制Linux:Linux…
Windows打印机管理向Lin…
  Windows 打印管理在Linux 平台实现         
Windows 打印管理在Linux 平台实现
 

本文介绍了一种在 Linux 平台上实现 Windows 打印机管理的移植方法及具体实现细节。通过本文,读者可以了解相关技术,并把这些技术直接应用到实际软件开发中。

1.理解 Windows 打印机管理和 Linux 打印机管理

    Windows 平台提供了非常简单而且完善的打印机管理系统。在 Windows 编程中,打印功能被融入了 GDI (Graphic Device Interface)模块。在 GDI 模块中,程序员只要调用 EnumPrinters() 等 APIs 就可以轻松获取打印机信息。Windows 的这种成熟打印管理机制很大程度上得益于打印机供应商所提供的完善的打印机驱动。Windows 的打印机驱动屏蔽了打印机的具体打印实现细节,同时为上层调用提供了简单的 API 接口。

    与 Windows 平台相反,打印机管理机制在 Linux 平台上从产生到成熟却经过了一个漫长的过程。Linux 打印系统最早源于 UNIX 打印系统,但 UNIX 系统却一直缺乏统一的标准接口。由于历史原因,不同 UNIX 平台使用着不同的打印系统。在各种 UNIX 打印解决方案中,最流行的是 Berkeley 打印系统和 System V 打印系统。一方面,不同打印系统需要不一样的打印驱动支持;另一方面,UNIX 只拥有相对较小的客户群。这些因素使得很多打印机供应商完全放弃了对 UNIX 平台的支持。统一打印接口的缺乏和底层驱动的不完善使打印在很长一段时间内成为了 Linux 平台的一大功能漏洞。

    最终 CUPS (Common UNIX Printing System)的出现解决了上述窘境。CUPS 是UNIX/Linux 上通用的打印系统。CUPS 提供了一套 CUPS API 来完成 UNIX/Linux系统和打印机之间的交互。例如,用户可以通过 CUPS 获取打印机的信息,也可以通过 CUPS 设置打印机。CUPS 提供了对 Berkeley 和 System V 打印命令的支持,这种兼容性使得之前的系统不用进行大规模修改就可被延续使用。同时,CUPS 还提供一系列模块化的过滤接口。通过这些接口,打印机提供商只需要开发一个驱动程序就可以满足所有平台的需求。至今为止,CUPS 已被所有 UNIX 和 Linux 平台所支持。

2.打印机管理移植架构

    打印机管理移植是应用程序跨平台移植的重要组成部分。不同平台所支持的打印接口是不同的,因此移植的核心就是实现平台之间的打印机管理接口的转换。下图展示了打印机管理移植的架构。


图1 打印机管理移植架构
图1  打印机管理移植架构

    Windows 提供了一系列 API 来获取打印机信息。这些信息被封装在预定义的Windows 标准结构中,比如 DEVMODE,PRINTER_INFO_2,PRINTER_INFO_4 等等。Linux 使用 CUPS 来获取打印机信息,这些信息被封装在 cups_dest_t,ipp_attribute_t 等数据结构中。只要正确获取 Linux 平台上打印机信息,并把它们转化成 Windows 打印机数据结构,就可以完成打印机管理。

3.CUPS 基础知识

    CUPS 是 UNIX/Linux 平台上的打印系统。CUPS 的定义和实现是基于 IPP(Internet Printing Protocol)协议的。IPP 是通用的打印系统标准,它的功能和操作被一系列RFC(Request for Comments)所详细定义。这些具体功能和操作包括:建立 IPP请求,应答 IPP 请求和设置 IPP 请求等等。和 IPP 相关的 RFC 包括 RFC1179,RFC2910,RFC2911,RFC3196 等等。在网络协议中,IPP 位于 HTTP(Hyper-Text Transport Protocol)协议之上。因此以下代码示例将涉及到很多 IPP 和 HTTP的系统调用,例如 ippAddString() 和 httpConnectEncrypt() 等等。此外,在UNIX/Linux 平台上在使用 CUPS 之前要提前引入下列头文件:


#include <cups/cups.h>

#include <cups/language.h>

#include <cups/http.h>

#include <cups/ipp.h>


    有了上述 CUPS 基础知识,下文将举例说明使用 CUPS 实现打印机管理移植的技术细节。

4.获取打印机数量

    Windows 通过 API EnumPrinters() 的返回参数 pcReturned 来获取系统的打印机数量。Windows 程序的具体实现如下所示:


int n_PrinterCount;

EnumPrinters( , , , , , , &n_PrinterCount);


    在 Linux 中,CUPS 函数 cupsGetDests() 可实现同样的功能。需要注意的是,在调用结束后,调用者需要使用 cupsFreeDests() 来释放内存。


    cups_dest_t *dests;

    int n_PrinterCount = cupsGetDests( &dests );

    cupsFreeDests(count, dests);

5.获取打印机名称,打印机端口和打印机型号

    Windows使用API EnumPrinters() 来获取打印机名称,打印机端口和打印机型号。详情请参考Windows MSDN。在Linux平台上,CUPS可实现同样的功能。具体实现流程如下图所示:


图2 获取打印机信息(名称,端口,型号)流程
图2  获取打印机信息(名称,端口,型号)流程

5.1建立 HTTP 连接

    使用 CUPS 获取打印机名称,打印机端口和打印机型号信息首先需要开启 IPP 和HTTP 服务。开启服务的第一步是建立一个 HTTP 连接来和 CUPS 服务器取得联系。在下面的代码中,cupsServer() 将返回指向默认 CUPS 服务器名称的指针;ippPort() 将返回 IPP 请求的默认端口号;cupsEncryption() 将返回当前 CUPS 请求的默认加密设置。将这些返回值作为参数传递给函数 httpConnectEncrypt() 就可以建立一个 HTTP 连接。如果 HTTP 连接建立成功,即 httpConnectEncrypt() 的返回值pHTTPConnection 有效,那么就可以基于这个连接进行下一步 IPP 请求。


    

    http_t *pHTTPConnection = httpConnectEncrypt( cupsServer(),

                                             ippPort(),

                                             cupsEncryption() );

    if (!pHTTPConnection)

    {

        g_print("Cannot connect to CUPS server\n");

        return 0;

    }

    

5.2建立 IPP 请求

    建立一个新的 IPP 请求是通过 IPP 调用 ippNew() 来实现的。在此,operation_id 被设置为 CUPS_GET_PRINTERS,其语义是当前 IPP 请求要获取和打印机相关的信息。同时,request_id 被设置为 1,这是 IPP 协议所规定的。


    

    ipp_t *pIPPReq = ippNew();

    pIPPReq->request.op.operation_id = CUPS_GET_PRINTERS;

    pIPPReq->request.op.request_id = 1;

Linux联盟收集整理

频道声明:本频道的文章除部分特别声明禁止转载的专稿外,可以自由转载.但请务必注明出出处和原始作者 文章版权归本频道与文章作者所有.对于被频道转载文章的个人和网站,我们表示深深的谢意。

原始作者:佚名 录入时间:2007-1-3 3:57:07
信息来源:不详 投稿信箱:itqoo@126.com
教程录入:itqoo    责任编辑:itqoo 
  • 上一个教程:

  • 下一个教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    - 关于我们 - 合作伙伴 - 友情链接 - 广告刊登 - 投稿热线 - 在线留言版权声明联系方式 -
    IT公社版权所有 粤ICP备05127012号
    Copyrigh@2005-2006 itqoo.com.Inc All Rights Reserved  推荐分辨率 1024*768
    联系站长:E-Mail:itqoo@126.com     MSN:urchincc@hotmail.com    QQ:点击这里给我发消息
    特别感谢:亿太网络提供空间支持