При работе с 32-битными приложениями на 64-битных операционных системах Windows, могут возникать проблемы с ожиданием завершения 64-битных процессов. Это связано с особенностями работы Windows в режиме WOW64 (Windows 32-bit on Windows 64-bit), который позволяет запускать 32-битные приложения на 64-битных системах.
Проблема
Пользователь столкнулся с проблемой, когда его 32-битное приложение, использующее функцию gShellExecuteAndWait, не могло ожидать завершения 64-битных процессов. При вызове mstsc.exe (программы для удаленного рабочего стола) из 32-битного приложения на 64-битной системе, процесс немедленно завершался, что указывало на проблему с ожиданием.
Подтвержденное решение
Проблема заключается в том, что при запуске 32-битного mstsc.exe из-под WOW64, он определяет, что ему необходимо запустить 64-битную версию, и сразу же завершает работу. Это поведение связано с особенностями работы WOW64 и перенаправлением файловой системы.
Возможные решения
Отключение перенаправления файловой системы перед запуском нового процесса и его повторное включение после завершения. Это позволяет избежать конфликтов, связанных с WOW64.
Создание небольшой 64-битной программы, которая будет запускать другие процессы. Это позволяет выйти из эмуляции WOW64 и избежать перенаправления файловой системы.
Пример кода
Вот пример модифицированной функции gShellExecuteAndWait, которая отключает перенаправление файловой системы перед запуском процесса и включает его обратно после завершения ожидания:
function gShellExecuteAndWait(...): Boolean;
var
...
IsWow64Process: function(aProcess: THandle; var aWow64Process: Bool): Bool; stdcall;
Wow64DisableWow64FsRedirection: function(aOldValue: pointer): Bool; stdcall;
Wow64RevertWow64FsRedirection: function(aOldValue: pointer): Bool; stdcall;
...
begin
// Проверка, запущен ли процесс в режиме WOW64
if IsWow64Process(GetCurrentProcess, Wow64) then
begin
// Отключение перенаправления файловой системы
Wow64DisableWow64FsRedirection(OldFs);
end;
// ... (остальная часть кода)
// После завершения ожидания, если процесс запущен в режиме WOW64
if Wow64 then
Wow64RevertWow64FsRedirection(OldFs);
end;
Альтернативное решение
Другой подход заключается в использовании функции CreateProcess для запуска процесса, вместо ShellExecuteEx. Это позволяет избежать некоторых проблем, связанных с оболочкой и ее поведением.
Заключение
При работе с 32-битными приложениями на 64-битных системах важно учитывать особенности WOW64 и перенаправления файловой системы. Использование правильных методов и функций, а также корректное управление состоянием перенаправления файловой системы, позволяет эффективно решать проблемы с ожиданием завершения процессов.
Проблемы и методы решения при ожидании завершения 64-битных процессов, запущенных из 32-битных приложений на 64-битных операционных системах Windows, связанные с работой WOW64 и перенаправлением файловой системы.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS