如果打印机不存在,我会向假脱机程序发送不同的文件。在我的软件中,我尝试将所有文件存在于假脱机程序的队列中。为此,我尝试了以下指令:
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)
我的最后一个问题是:是否有可能从打印机的后台程序中获取所有作业?
你有解决方案吗?
答案 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
流程如下:
EnumJobs
,了解需要为JOB_INFO_n
阵列分配多少内存。JOB_INFO_n
阵列所需的内存。EnumJobs
数组拨打JOB_INFO_n
。 通过调查您尝试获取前三个作业的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
希望这有帮助。