Показать сообщение отдельно
Старый 12.01.2006, 14:03   #5  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,656 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Как мне кажется, уважаемые гуру пропустили главную проблему при работе с Acrobat.

Acrobat сам НЕ ЗАКРЫВАЕТСЯ.

Это главная проблема. Бессмысленно ждать завершения этого процесса, поскольку он автоматически НИКОГДА НЕ ЗАКРОЕТСЯ.

Попробуйте дать из командной строки Windows команду вроде

AcroRd32.exe /p /h "C:\Program Files\Adobe\Acrobat 5.0\Help\ENU\acrobat.pdf"

Ключ /p - это отправка на печать, а ключ /h - это скрытый режим работы. Эту команду я взял не "с потолка", а из реестра Windows. Посмотрел, какая команда там записана при печати файлов через ShellExecute.

Наблюдается 2 глюка:
  1. Окно Acrobat открывается, несмотря на явное указание ключа /h
  2. После окончания печати, окно Acrobat остается открытым. Т.е. процесс НЕ ЗАВЕРШЕН

Это значит, что при использовании API-функций в режиме ожидания завершения процесса я просто "подвешиваю" AXAPTA. Ну, или придется ЯВНО указать время ожидания, что эквивалетно использованию функции sleep()

Ну, и у меня при запуске через приведенную по ссылке belugin функцию требует указания полного пути доступа к файлу AcroRd32.exe, что плохо как само по себе, так и с точки зрения того, что нужно ЯВНО указать имя запускающего файла. А это может быть и не AcroRd32.exe, а, например, acrobat.exe

Впрочем, это мелочи.

Таким образом, получается, что оценивать факт выполнения печати по тому, запущен Acrobat или нет просто не получается. Он не закрывается!

Следовательно, единственное оставшееся место контроля - это очередь на печать. Надо отловить момент появления нужного мне задания в очереди и только после этого посылать на печать следующий файл.

Даже через WMI это кажется не тривиальной задачей. А если учесть тот факт, что WMI - это потенциальная "дыра" в безопасности и некоторые продвинутые пользователи его просто отключают, то остается искать нужные API-функции.

В любом случае, дело это не быстрое. Пока сделал такую заплатку:

PHP код:
while (...) 

        
WinApi::shellExecute(...); 
        if (
Box::okCancel("После окончания печати (имя файла pdf)"+
                                
" нажмите кнопку \"Ok\" для продолжения печати"+
                                    
" или кнопку \"Отмена\" для прерывания печати",
                
DialogButton::Ok,
                
"Печать следующего файла",
                
"Печать следующего файл") == DialogButton::Cancel)
        {
            break;
        }


Т.е. пользователь сам контролирует время задержки. Конечно решение "не очень". Но пока я буду искать решение через API-функции, думаю, сойдет...