如果打印机不存在,我会向假脱机程序发送不同的文件。在我的软件中,我尝试将所有文件存在于假脱机程序的队列中。为此,我尝试了以下指示:
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。
要确定所需的缓冲区大小,请调用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
希望这可以帮助。