В последнее время Adobe Reader X обзавёлся новой функцией, которая включается по умолчанию – "Enable Protected Mode at Startup". Эта функция предназначена для защиты от вредоносного ПО, которое может использовать ассоциации файлов PDF для своих целей. Однако, для приложений, использующих ассоциации файлов для автоматического открытия PDF, это может стать проблемой.
В нашем случае, приложение, написанное на Delphi, генерирует отчёты в формате PDF, которые должны открываться автоматически сразу после создания. Для этого используется функция ShellExecute. Однако, начиная с Windows 7 и Vista, при попытке открыть документы с помощью этой функции, пользователи сталкиваются с ошибкой доступа.
Пример кода для открытия PDF:
var
pdfFile: string;
begin
pdfFile := 'C:\Users\Ronaldo\Documents\appName\reports\file.pdf';
ShellExecute(0, 'open', PChar(pdfFile), '', '', SW_SHOW);
end;
Возможные решения:
Изменение параметров в ShellExecute: Попробуйте изменить параметры вызова ShellExecute, передав nil в качестве второго параметра, что позволит использовать действие по умолчанию. Также можно установить параметры после пути к файлу в nil, что упрощает код, и использовать SW_NORMAL вместо SW_SHOW для соответствия пользовательским предпочтениям.
Исследование реестра Windows: Изучите реестр для определения команд, используемых для открытия PDF-файлов. Возможно, потребуется добавить дополнительные параметры в команду, вызывающую Adobe Reader.
Подтверждённый ответ:
Пользователь обнаружил, что проблема связана с использованием переменной окружения USERPROFILE для определения пути к папке с отчётами. В Windows 7 UAC не позволяет явно указывать путь к "Моим документам", поэтому было решено использовать функцию SHGetFolderPath для получения пути к личным папкам пользователя, используя параметр CSIDL_Personal.
Пример функции GetSpecialFolderPath:
function GetSpecialFolderPath(folder : integer) : string;
const
SHGFP_TYPE_CURRENT = 0;
var
path: array [0..MAX_PATH] of char;
begin
if SUCCEEDED(SHGetFolderPath(0, folder, 0, SHGFP_TYPE_CURRENT, @path[0])) then
Result := path
else
Result := '';
end;
Вызов функции:
GetSpecialFolderPath(CSIDL_Personal);
Использование этой функции позволило обойти защиту Adobe Reader X и открыть PDF-файлы из Delphi-приложения без ошибок доступа.
Пользователь сталкивается с проблемой открытия PDF-файлов из Delphi-приложения из-за новой функции защиты Adobe Reader X и пытается найти решение, изменяя параметры вызова `ShellExecute` или реестра Windows, и находит рабочий вариант с использо
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.