При разработке программного обеспечения на языке Delphi, особенно при работе с устаревшими версиями, такими как Delphi 7, можно столкнуться с различными проблемами совместимости, особенно при переходе на новые операционные системы, такие как Windows 10. В данном случае, рассматривается проблема запуска встроенных приложений Windows, таких как Defragmentation и On-screen Keyboard, с использованием функций Windows API в Delphi 7.
Проблема
Использование функций ShellExecute для запуска системных приложений из Delphi 7 в Windows 10 привело к ошибкам. Несмотря на то, что имена файлов остались прежними, изменения в системе безопасности Windows 10, вероятно, препятствуют запуску приложений из папки C:\Windows\System32.
Решение
Применение функции ShellExecuteEx или CreateProcess вместо ShellExecute может улучшить отчетность об ошибках, но не решит проблему.
Подтвержденный ответ
Основная проблема заключается в том, что Delphi 7 производит только 32-битные приложения, и на 64-битной системе Windows 10 они работают в режиме WOW64 (Windows 32-bit on Windows 64-bit). Это приводит к тому, что запросы к папке System32 автоматически перенаправляются в SysWOW64, где могут отсутствовать необходимые приложения.
Для решения проблемы предлагается два варианта:
Использование специального псевдонима Sysnative в пути к приложению, который работает только в режиме WOW64. Для определения необходимости использования Sysnative следует использовать функцию IsWow64Process.
function GetSystem32Folder: string;
var
Folder: array[0..MAX_PATH] of Char;
IsWow64: BOOL;
begin
// ...
end;
function RunDefrag: Boolean;
var
SysFolder: string;
Res: Integer;
begin
// ...
end;
function RunOnScreenKeyboard: Boolean;
begin
// ...
end;
Временное отключение перенаправления файловой системы с помощью функции Wow64DisableWow64FsRedirection и последующее восстановление с помощью Wow64RevertWow64FsRedirection.
function GetSystem32Folder: string
var
Folder: array[0..MAX_PATH] of Char;
begin
// ...
end;
function RunDefrag: Boolean;
var
SysFolder: string;
OldState: Pointer;
Res: Integer;
begin
// ...
end;
function RunOnScreenKeyboard: Boolean;
var
OldState: Pointer;
begin
// ...
end;
Однако стоит отметить, что запуск osk.exe может быть невозможен, если включена Учетная запись пользователя (UAC). В этом случае потребуется создать вспомогательный 64-битный процесс для запуска osk.exe от имени вашего приложения.
Альтернативный ответ
Если функция Wow64DisableWow64FsRedirection недоступна в вашей версии Delphi, можно использовать динамическое обращение к этой функции.
function ChangeFSRedirection(bDisable: Boolean): Boolean;
var
// ...
begin
// ...
end;
Заключение
При работе с 32-битными приложениями на 64-битной операционной системе важно учитывать особенности работы WOW64 и возможные ограничения безопасности, такие как UAC. Использование предложенных решений позволит обойти проблемы совместимости и обеспечить корректную работу встроенных приложений в Delphi 7 на Windows 10.
При разработке в Delphi 7 для Windows 10 возникла проблема с обходом политик безопасности для запуска встроенных приложений из-за изменений, связанных с переходом на 64-битную систему и режимом WOW64.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS