从后台处理程序获取作业 - C++
Get job from spooler - C++
对于不存在的打印机,我向后台处理程序发送了不同的文件。在我的软件中,我尝试获取后台处理程序队列中存在的所有文件。为此,我尝试了以下说明:
bool t = EnumJobs(hPrinter, 0,1,3, (LPBYTE) &h, sizeof(JOB_INFO_3), &pcbNeeded, &pcReturned)
我在结构的"JobId"字段中获得jobId。
在结构类型"JOB_INFO_3"中,字段"JobId"填充良好,但字段"nextJobId"未填充。为什么?
当我执行以下指令时,这是同样的问题:
bool t = EnumJobs(hPrinter, 0,3,3, (LPBYTE) &h, sizeof(JOB_INFO_3), &pcbNeeded, &pcReturned)
此外,字段"JobId"未填充。为什么?
然后,我不知道如何获取特定工作的信息(文件名,状态,页数等)。我尝试了以下说明,但没有用:
GetJobA(hPrinter, h.JobId, 1, (LPBYTE) &job_info_1, sizeof(JOB_INFO_1), & nbBytes)
我的最后一个问题是:是否有可能从打印机的后台处理程序获取所有作业?
你有什么解决方案吗?
所以,我不确定你的其余代码是什么样的,但看起来你可能没有完全正确地使用 API。MSDN 文档建议您应该调用EnumJobs
API 两次。
若要确定所需的缓冲区大小,请在 cbBuf 设置为零的情况下调用枚举作业。EnumJobs 失败,GetLastError 返回ERROR_INSUFFICIENT_BUFFER,pcbNeeded 参数返回保存结构数组及其数据所需的缓冲区的大小(以字节为单位)。
https://msdn.microsoft.com/en-us/library/windows/desktop/dd162625(v=vs.85).aspx
流程是这样的:
- 首次调用
EnumJobs
以查看需要为JOB_INFO_n
阵列分配多少内存。 - 分配
JOB_INFO_n
阵列所需的内存。 - 使用
JOB_INFO_n
阵列调用EnumJobs
。
查看对 EnumJobs 的调用,您尝试获取前三个作业,您的pJob
的大小似乎是sizeof(JOB_INFO_3)
,它应该是这个大小的三倍才能容纳所有三个作业。该电话的EnumJobs
回报是多少?
nextJobId
没有填写的原因很可能是对领域的误解。此字段用于已链接在一起的打印作业,而不是找出队列中的下一个打印作业。
NextJobId - 链接的打印作业集中下一个打印作业的打印作业标识符。
https://msdn.microsoft.com/en-us/library/windows/desktop/dd145021(v=vs.85).aspx
至于有关打印作业的信息,这将很困难。不幸的是,我知道没有办法打印文件的名称/路径。后台处理程序 API 中没有此概念。例如,考虑不受文件支持的打印作业。您得到的最好的是打印作业名称,该名称由打印应用程序设置。
对于页面,看起来JOB_INFO_1
结构中有一个TotalPages
字段。这可能对你有用。看起来您已经在尝试获得JOB_INFO_1
结构,但遇到了一些麻烦。如果 API 失败,您可以使用GetLastError()
来确定问题所在。传入的作业 ID 是否存在?
https://msdn.microsoft.com/en-us/library/windows/desktop/ms679360(v=vs.85).aspx
有关从队列中获取所有打印作业的最后一个问题。MSDN 文档似乎建议如下:
若要确定打印机队列中的打印作业数,请在 Level 参数设置为 2 的情况下调用 GetPrinter 函数。
https://msdn.microsoft.com/en-us/library/windows/desktop/dd162625(v=vs.85).aspx
希望这有帮助。
- 将执行、作业和WinAPI相乘
- 为什么我的多线程作业队列崩溃
- 正在解码MSVC 32位版本的程序集(作业).没有手术做什么
- 使用"Task"函数指针队列定义作业管理器
- C++秘密消息学校作业
- 动态类的分段错误(家庭作业问题)
- 我已经阅读了很多关于 2d 数组的信息,但我在作业中使用它时遇到了麻烦
- CMAKE:动态作业池更改
- C++17 排序:作业左侧的后递增
- 所以我正在为我的学校作业练习继承,但我无法正确实施标题保护
- 类作业中的非左值
- 不知道如何在家庭作业任务中实现一件事
- 我正在尝试为家庭作业加密邮件
- 将作业传递给另一个函数,而不会延迟 arduino
- 正在取消线程池中运行的任意作业
- 由 JOB 中的进程启动的子进程是否可以将 JOB 属性设置为脱离作业?
- 我正在尝试解决英特尔架构并行基础课程中关于 Coursera 的一项作业
- 复印作业操作员说明
- 是回文作业练习
- 为什么作业提交网站的输出与Visual Studio不同