Наше приложение, написанное на Delphi, генерирует серию отчетов, большинство из которых в формате PDF, которые автоматически открываются при создании. Adobe X представила функцию, которая включена по умолчанию, «Включить защищенный режим при запуске». PDF-файлы отчета открываются с помощью «ShelExecute».
var
pdfFile: string;
begin
pdfFile := 'C:\Users\Ronaldo\Documents\appName\reports\file.pdf';
ShellExecute(0, 'open', PChar(pdfFile), '', '', SW_SHOW);
//
end;
Из-за этой новой новой настройки Adobe Reader в Win 7 или Vista мы получаем сообщение об ошибке при открытии документа. Двойной щелчок по документу, чтобы открыть его, не вызывает никаких проблем. Есть ли способ отключить защищенный метод или другой способ открыть документ без получения ошибки (обходной путь)?
*Дополнительная информация *
Файл PDF создается в нашем серверном приложении, передается клиенту, а клиент генерирует pdf (используя Write). Сначала я подумал, что это может быть проблемой, но опять же, почему двойной щелчок работает нормально.
Я создал фиктивное приложение, которое ничего не делает, но использует тот же код выше, чтобы открыть pdf, и оно работает. Я проверил привилегии приложения - все то же самое - разница только в том, что тот, который не работает, устанавливается в ОС с помощью правильного установщика - другой (пустой) я просто создал и закинул его туда.
Один из комментариев спрашивает об ассоциации файлов - это не должно быть проблемой, поскольку приложению удается запустить Adobe Reader - затем Adobe Reader выдает мне сообщение об ошибке «отказано в доступе». Двойной щелчок по тому же файлу работает нормально.
Новая информация — 30 марта 2011 г., 14:50 (по новозеландскому времени)
Я внес изменения в код только для того, чтобы проверить единственное различие между самим приложением и фиктивным приложением. Вместо того, чтобы автоматически получать путь к файлу и имя файла, теперь он открывает OpenDialog — свойство Filename в opendialog используется в качестве параметра для ShellExecute (как указано в комментарии после ответа Кена) — это работает. Почему, когда вы получаете имя файла из открытого диалогового окна, оно работает — обратите внимание, что я не открываю файл из диалогового окна — я получаю имя файла и использую его в качестве параметра для ShellExecute.
Обновленный пример кода
Когда пользователь нажимает кнопку «Создать отчет», отчет открывается автоматически после его создания. Кроме того, есть сетка, показывающая все сгенерированные отчеты для этого пользователя — это код двойного щелчка для этой сетки:
if GetSelectedReport <> nil then // this will check if the user selected an report
if TReportItemState(GetSelectedReport.State) in [risGenerated,risViewed] then // checks if the report selected is in the correct state to be displayed.
begin
fileName := TClientReportManager.Singleton.Directory+'\'+GetSelectedReport.Filename; // a string with the filePath + fileName
ShellExecute(0, 'open', pchar(fileName), '','', SW_MAXIMIZE); // command to open the file
end;
Мое первое предположение о работе Opendialog заключается в том, что открытый диалог изменяет CurrentDir. Поэтому я уже пробовал SetCurrentDir и ChDir, чтобы изменить текущий каталог на тот, где находятся файлы. Нет успеха.
В Win 7 путь к файлу преобразуется в C:\Users\Ronaldo\Documents\CompanyName\AppName.
ShelExecute
, которое вы используете, чтобы открыть документ? - person RRUZ   schedule 29.03.2011A := 1;
На клавиатурах США обратная кавычка обычно находится вверху слева в сочетании с тильдой ~ над клавишей табуляции. - person Marjan Venema   schedule 29.03.2011