0

0

C++如何读取系统打印机列表?(CUPS或Windows Print Spooler API)

穿越時空

穿越時空

发布时间:2026-02-18 16:28:03

|

114人浏览过

|

来源于php中文网

原创

windows用enumprinters需设dwlevel=2并两次调用获取缓冲区大小;linux/macos用cups时应优先cupsgetdests,注意权限、socket路径及默认打印机需单独查询。

c++如何读取系统打印机列表?(cups或windows print spooler api)

Windows 下用 EnumPrinters 获取本地打印机列表

直接调用 Windows API 是最轻量、最可靠的方式,不需要额外依赖或服务运行。前提是目标机器是 Windows,且程序有基础权限(普通用户即可)。

常见错误现象:EnumPrinters 返回 0 个打印机,或调用失败返回 ERROR_INSUFFICIENT_BUFFER —— 这不是没打印机,而是你没给够缓冲区,或者没正确设置 dwLevel

  • dwLevel 必须设为 2PRINTER_INFO_2),才能拿到名称、状态、是否默认等关键字段;设成 1 只能拿到名字,但很多字段是空的
  • 第一次调用要传 NULL0,靠返回值确定所需缓冲区大小,再分配内存重试 —— 跳过这步直接 malloc 固定大小,大概率崩或漏数据
  • 返回的 PRINTER_INFO_2 结构里,pPrinterName 是有效指针,但必须用 LocalFree 释放整个缓冲区,不能单独 free 某个字段
  • 如果只想要启用的本地打印机,过滤时检查 status & PRINTER_STATUS_ERROR == 0Attributes & PRINTER_ATTRIBUTE_LOCAL

CUPS 环境下用 cupsGetPrinters 列出可用打印机

Linux/macOS 上走 CUPS 是标准路径,但要注意:它不等于“系统所有打印机”,而是 CUPS 自己管理的队列列表 —— 如果打印机没被添加进 CUPS(比如纯 USB 直连未配置),就不会出现。

常见错误现象:cupsGetPrinters 返回空数组,但 lpstat -p 却能看到 —— 很可能因为没调用 cupsSetServer 或环境变量 CUPS_SERVER 指向了错误地址(默认是 /run/cups/cups.socklocalhost:631)。

立即学习C++免费学习笔记(深入)”;

Unreal Images
Unreal Images

免费的AI图片库

下载
  • 调用前建议先执行 cupsGetDests,它比 cupsGetPrinters 更健壮,能兼容 IPP Everywhere 打印机,且返回结构更扁平
  • cupsGetPrinters 返回的是 cups_dest_t * 数组,每个元素的 name 字段才是打印机名,instance 通常为空
  • 记得在用完后调用 cupsFreeDests,否则内存泄漏 —— CUPS 的 dest 数组不是简单 malloc 出来的,内部有引用计数
  • 如果你的程序跑在容器里,确保挂载了 /run/cups/cups.sock,或配置了正确的 CUPS_SERVERCUPS_ENCRYPTION=IfRequested

跨平台?别硬凑,按部署环境选路径

没有“一个函数通吃 Windows/Linux/macOS”的方案。强行封装抽象层,反而会让错误更难定位,比如把 cupsGetPrinters 的空结果误判为“无打印机”,而实际是 CUPS 服务根本没起来。

性能与兼容性影响很实际:Windows 下调 EnumPrinters 是毫秒级;CUPS 调用则涉及 socket 连接、HTTP 请求解析,首次调用可能卡几十毫秒,尤其在 CUPS 配置混乱时。

  • 构建时用 #ifdef _WIN32 分支,而不是试图用 libusb 或 dbus 直读底层 —— 那些路径权限高、不稳定、且不同发行版行为不一
  • macOS 本质也走 CUPS,但部分 AirPrint 打印机可能只出现在 bonjour 发现结果里,cupsGetPrinters 不会返回它们;真要支持,得另接 dns_sd.h
  • 不要在主线程同步调用这些 API,特别是 CUPS —— 网络超时或套接字卡住会导致界面冻结;至少设个 3 秒超时,或扔进线程池

默认打印机怎么拿?别只看列表顺序

很多人以为第一个就是默认,其实 Windows 和 CUPS 都有独立的“默认”标记位,必须显式查。

Windows 下用 GetDefaultPrinter(注意:它只返回名字字符串,不带其他信息,得再用 OpenPrinter 查详情);CUPS 下得调 cupsGetNamedDest 并传 NULL 作为 printer name,它才会返回默认那个。

  • GetDefaultPrinter 在 Windows 10 1809+ 支持多用户上下文,但如果你的服务跑在 Session 0,它会返回空 —— 这不是 bug,是 Session 隔离设计
  • CUPS 的默认打印机可能属于另一个用户(比如 root 添加的队列),普通用户调 cupsGetNamedDest 可能拿不到,得检查返回值是否为 NULL 并 fallback 到第一个可用项
  • 别缓存“默认打印机名”太久,用户随时可能在控制面板里改 —— 如果你的应用需要持续感知,默认状态应定期(比如每分钟)轮询一次
实际写的时候最容易忽略的,是权限和上下文隔离:Windows 服务进程看不到用户 Session 的打印机,CUPS 客户端在容器里看不到宿主机的 socket,这些不是代码写错了,而是部署环境本身就没对齐。

相关文章

打印机修复助手
打印机修复助手

打印机修复助手拥有数百万打印机驱动资源库,支持1000+品牌,可自动识别打印机品牌和型号,快速匹配下载对应的驱动程序,自动完成驱动修复。有需要的小伙伴快来保存下载使用吧!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

192

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

12

2026.02.03

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

244

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

766

2024.03.01

session失效的原因
session失效的原因

session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。

327

2023.10.17

session失效解决方法
session失效解决方法

session失效通常是由于 session 的生存时间过期或者服务器关闭导致的。其解决办法:1、延长session的生存时间;2、使用持久化存储;3、使用cookie;4、异步更新session;5、使用会话管理中间件。

772

2023.10.18

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

97

2025.08.19

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

553

2023.08.03

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

561

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 9.3万人学习

Excel 教程
Excel 教程

共162课时 | 17.8万人学习

PHP基础入门课程
PHP基础入门课程

共33课时 | 2.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号