Как мне кажется, уважаемые гуру пропустили главную проблему при работе с Acrobat.
Acrobat сам НЕ ЗАКРЫВАЕТСЯ.
Это главная проблема. Бессмысленно ждать завершения этого процесса, поскольку он
автоматически НИКОГДА НЕ ЗАКРОЕТСЯ.
Попробуйте дать из командной строки Windows команду вроде
AcroRd32.exe /p /h "C:\Program Files\Adobe\Acrobat 5.0\Help\ENU\acrobat.pdf"
Ключ /p - это отправка на печать, а ключ /h - это скрытый режим работы. Эту команду я взял не "с потолка", а из реестра Windows. Посмотрел, какая команда там записана при печати файлов через ShellExecute.
Наблюдается 2 глюка:
- Окно Acrobat открывается, несмотря на явное указание ключа /h
- После окончания печати, окно 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-функции, думаю, сойдет...