从spooler获得工作 - C ++

时间:2018-01-04 12:19:28

标签: c++ windows printing

如果打印机不存在,我会向假脱机程序发送不同的文件。在我的软件中,我尝试将所有文​​件存在于假脱机程序的队列中。为此,我尝试了以下指令:

 bool t = EnumJobs(hPrinter, 0,1,3, (LPBYTE) &h, sizeof(JOB_INFO_3), &pcbNeeded, &pcReturned)

我在外地找工作' 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)

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

你有解决方案吗?

1 个答案:

答案 0 :(得分:0)

因此,我不确定代码的其余部分是什么样的,但看起来您可能没有正确使用API​​。 MSDN文档建议您应该两次调用EnumJobs API。

  

要确定所需的缓冲区大小,请调用EnumJobs并将cbBuf设置为零。 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. 使用EnumJobs数组拨打JOB_INFO_n
  4. 通过调查您尝试获取前三个作业的EnumJobs,pJob的大小似乎为sizeof(JOB_INFO_3),其大小应为此大小的三倍,以便保留所有作业三个工作。 EnumJobs对该电话的回报是什么?

    未填写nextJobId的原因可能是对该领域的误解。此字段用于已链接在一起的打印作业,而不是查找队列中下一个打印作业。

      

    NextJobId - 链接的打印作业集中下一个打印作业的打印作业标识符。

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

    关于打印作业的信息,这将很困难。不幸的是,我无法知道打印文件的名称/路径。假脱机程序API中没有这个概念。考虑一个没有文件支持的打印作业。您获得的最好的是打印作业名称,该名称由打印应用程序设置。

    对于网页,TotalPages结构中似乎有JOB_INFO_1字段。这可能对你有用。看起来你已经在尝试获得JOB_INFO_1结构,但遇到了一些麻烦。如果API失败,您可以使用GetLastError()来确定问题所在。您传入的职位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

    希望这有帮助。