Наше приложение, написанное на 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-файл (используя запись) - сначала я подумал, что это может быть проблемой - но опять же, почему двойной щелчок работает нормально.
Я создал фиктивное приложение, которое ничего не делает, кроме использования тот же код выше, чтобы открыть PDF-файл, и он работает. Я проверил привилегии приложения - все равно - единственная разница в том, что тот, который не работает, устанавливается в ОС с помощью подходящего установщика - другой (фиктивный) я только что создал и сбросил туда.
В одном из комментариев спрашивается об ассоциации файлов - это не должно быть проблемой, поскольку приложение успешно запускает Adobe Reader. Затем Adobe Reader выдает мне сообщение об ошибке «Доступ запрещен». Двойной щелчок по тому же файлу работает нормально.
Новая информация - 30.03.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