Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Решение проблем с рабочими каталогами при запуске программ через ShellExecuteEx: от XP до Vista и 7

Delphi , ОС и Железо , Windows

Проблема, с которой сталкиваются разработчики, работающие с запуском одного EXE файла из другого, заключается в том, что поведение программы может отличаться в зависимости от того, через сколько уровней индиректного запуска она была вызвана. В частности, пользователь столкнулся с ситуацией, когда приложение App3.exe запускалось без ошибок, если его вызывало приложение App2.exe, но при запуске App2.exe через App1.exe, App3.exe отображал свой графический интерфейс вместо ожидаемого автоматического создания файла вывода и закрытия. Проблема была особенно заметна на системах Windows Vista и 7, в то время как на XP всё работало корректно.

Контекст проблемы

При запуске приложения App3.exe с помощью функции ShellExecuteEx, передаваемые параметры командной строки должны были скрыть графический интерфейс и автоматически сгенерировать файл вывода. Однако, когда App2.exe запускал App3.exe через App1.exe, интерфейс отображался, и файл вывода не создавался.

Пример кода

FillChar( exInfo, Sizeof(exInfo), 0 );
with exInfo do
begin
  cbSize:= Sizeof( exInfo );
  fMask := SEE_MASK_NOCLOSEPROCESS;
  lpVerb:= 'open';
  lpFile:= PChar('App3.exe');
  lpParameters := PChar('/Param1 Param2 "' + folderpath + 'outputfile.txt"');
  nShow := SW_HIDE;
end;
if ShellExecuteEx( @exInfo ) then
begin
  // Ожидание завершения процесса
end;
CloseHandle( exinfo.hProcess );

Подтвержденное решение

Проблема была связана с рабочим каталогом приложений. При запуске через несколько уровней индиректного вызова, рабочий каталог мог изменяться, что приводило к неправильной работе с параметрами командной строки и путями к файлам. Рекомендуется использовать абсолютные пути не только для параметров, но и для путей к EXE файлам, а также указывать начальный рабочий каталог в поле SHELLEXECUTEINFO.lpDirectory.

Альтернативные действия

Для устранения неопределенности в получении параметров командной строки, рекомендуется в самом приложении App3.exe выводить полученные параметры (например, с помощью MessageBox, OutputDebugString, запись в файл и т.д.). Это позволит убедиться, что параметры были получены корректно.

Оптимизация кода

Замену цикла с Sleep() и GetExitCodeProcess() можно выполнить с помощью одной функции WaitForSingleObject(), что упростит ожидание завершения процесса.

if ShellExecuteEx( @exInfo ) then
begin
  if WaitForSingleObject(exinfo.hProcess, INFINITE) = WAIT_OBJECT_0 then
    GetExitCodeProcess( exinfo.hProcess, exitcode );
  CloseHandle( exinfo.hProcess );
end;

Заключение

После изменения кода для передачи полного пути к файлу, проблема была решена, и приложение начало работать корректно. Это подчеркивает важность использования абсолютных путей и правильной настройки рабочего каталога при запуске программ через ShellExecuteEx.

Создано по материалам из источника по ссылке.

Проблема связана с неправильной работой приложения App3.exe при запуске через несколько уровней индиректного вызова из-за изменения рабочего каталога, что приводит к ошибкам в обработке командной строки и путях к файлам, особенно на системах Windows Vist


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Windows ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 21:41:13/0.0032880306243896/0