Как найти файл буфера для задания с заданным идентификатором, даже если объединение файлов буфера включено?

Я хотел бы скопировать данные буфера для данного задания печати Windows в произвольное место на диске.

У меня есть идентификатор задания печати из API диспетчера очереди печати. Я знаю, что эта работа закончила буферизацию. Я знаю, что задание не будет удалено до того, как я успею завершить все, что мне нужно.

Если объединение файлов отключено, я могу сделать это, найдя в каталоге спула файл формата «xxxxx.spl», где xxxxx — идентификатор задания с нулевым дополнением.

Как я могу это сделать, если включен пул файлов?

Я был бы рад, если бы существовал метод, который принимает идентификатор задания и возвращает поток данных буфера, но на данный момент это кажется маловероятным. Предположительно, нечто подобное может быть возможно при использовании OpenPrinter с «PrinterName,Job xxxx» и ReadPrinter, как описано в документации здесь, но пока я не смог заставить его работать, и даже если я это сделаю, похоже, что он загружает данные в память , и я не уверен, как это будет работать с большими буферными файлами (> 1 ГБ не является чем-то необычным).

Моим вторым предпочтением был бы способ передать идентификатор и вернуть расположение файла с данными буфера на диске (независимо от настройки пула файлов).

Моим третьим предпочтением был бы способ сопоставления объединенного файла («FPyyyyy.spl») с идентификатором задания, для которого он предназначен.

Возможны ли какие-либо из них, или у кого-нибудь есть лучшее представление о том, как решить эту проблему?

(Отредактировано, чтобы добавить, поскольку не было ясно, знали ли мы об этой опции): Наш запасной вариант — потребовать, чтобы наши клиенты отключили объединение буферных файлов, отредактировав реестр для каждого принтера, но мы бы предпочли избежать этого.


person Lawrence Johnston    schedule 12.10.2012    source источник
comment
Привет, откуда ты знаешь, что задание не будет удалено до того, как ты успеешь выполнить все, что нужно? Как сохранить файлы спула?   -  person Kira    schedule 18.07.2014


Ответы (2)


Я понял out, почему мои вызовы к OpenPrinter не удались, и я успешно прочитал данные спула, используя OpenPrinter и ReadPrinter, что прекрасно решает нашу проблему.

Тем не менее, я все равно присужу награду любому, кто предложит лучшее решение.

person Lawrence Johnston    schedule 14.12.2012

Вы читали это?

http://www.undocprint.org/winspool/spool_files

Вроде есть все что нужно :)

В частности To Turn Off Spool File Pooling on a Per Printer Queue-Basis

Существует также эта статья о формате файлов спула http://www.codeproject.com/Articles/9720/The-Windows-NT-print-spool-shadow-file-format однако, похоже, вы уже знаете формат, и он, вероятно, победит' ничем помочь.

person Jay    schedule 13.12.2012
comment
Да, я прочитал эту страницу. Мы хотели бы получить доступ к данным буфера без отключения пула файлов буфера. Мы бы предпочли избежать принуждения наших клиентов к редактированию реестра для каждого создаваемого ими принтера (или попытки сделать это за них). - person Lawrence Johnston; 14.12.2012