【问题标题】:Get job from spooler - C++从 spooler 获取工作 - C++
【发布时间】:2018-01-04 12:19:28
【问题描述】:

使用不存在的打印机,我将不同的文件发送到后台处理程序。在我的软件中,我尝试获取后台处理程序队列中存在的所有文件。为此,我尝试了以下说明:

 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)

我的最后一个问题是:是否可以从打印机的假脱机程序中获取所有作业?

你有什么解决办法吗?

【问题讨论】:

  • 我的回答有帮助吗? :)

标签: c++ windows printing


【解决方案1】:

所以,我不确定您的其余代码是什么样的,但您可能没有完全正确地使用 API。 MSDN 文档建议您应该调用EnumJobs API 两次。

要确定所需的缓冲区大小,请在 cbBuf 设置为零的情况下调用 EnumJobs。 EnumJobs 失败,GetLastError 返回 ERROR_INSUFFICIENT_BUFFER,而 pcbNeeded 参数返回保存结构数组及其数据所需的缓冲区大小(以字节为单位)。

https://msdn.microsoft.com/en-us/library/windows/desktop/dd162625(v=vs.85).aspx

流程是这样的:

  1. 第一次调用EnumJobs,查看需要为JOB_INFO_n 数组分配多少内存。
  2. 为您的JOB_INFO_n 数组分配所需的内存。
  3. 使用您的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

关于打印作业的信息,这将是困难的。不幸的是,我不知道如何打印文件的名称/路径。 spooler API 中没有这个概念。例如,考虑一个没有文件支持的打印作业。您得到的最好的是打印作业名称,它由打印应用程序设置。

对于页面,JOB_INFO_1 结构中似乎有一个 TotalPages 字段。这可能对你有些用处。看起来您已经在尝试获取 JOB_INFO_1 结构但遇到了一些麻烦。如果 API 失败,您可以使用 GetLastError() 来确定问题所在。你传入的job ID是否存在?

https://msdn.microsoft.com/en-us/library/windows/desktop/ms679360(v=vs.85).aspx

关于从队列中获取所有打印作业的最后一个问题。似乎 MSDN 文档建议如下:

要确定打印机队列中的打印作业数,请调用 GetPrinter 函数并将 Level 参数设置为 2。

https://msdn.microsoft.com/en-us/library/windows/desktop/dd162625(v=vs.85).aspx

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多