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

Управление процессами в Delphi: использование CreateProcess вместо ShellExecute для работы с MAME64

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

Введение

В данной статье мы рассмотрим проблему, связанную с управлением процессами в среде разработки Delphi, а именно использование функции CreateProcess вместо ShellExecute для взаимодействия с утилитой MAME64. MAME (Multiple Arcade Machine Emulator) - это эмулятор аркадных машин, который позволяет запускать различные старые игры. Для работы с MAME64 в Delphi, разработчики часто сталкиваются с необходимостью выполнения команд, таких как -listfull и -createconfig, для получения списка игр и создания конфигурационного файла соответственно.

Проблема

Разработчик столкнулся с проблемой, когда, используя ShellExecute для запуска MAME64 с параметрами -listfull и -createconfig, результаты первого вызова команды записывались в файл, в то время как второй вызов не давал никаких видимых результатов. Пример кода, который использовался разработчиком, выглядит следующим образом:

begin
  vDir:= 'C:\Emu\Mame\Mame64.exe';
  vDir2:= 'C:\Emu\Mame\gamelist.txt'; 
  ShellExecute(0, nil, 'cmd.exe', PChar('/C ' + vDir + ' -listfull > ' + vDir2), nil, SW_HIDE);
  Sleep(1000);
  ShellExecute(0, nil, 'cmd.exe', PChar('/C ' + vDir + ' -createconfig'), nil, SW_HIDE);
  Sleep(1000);
end;

Анализ проблемы

Проблема заключается в том, что MAME64 ожидает найти файл mame.ini в рабочей директории, и результаты работы программы должны быть записаны именно туда. При использовании ShellExecute рабочая директория не задается явно, и MAME64 пытается создать mame.ini в директории, где запущен процесс, что в случае запуска из Delphi будет означать директорию, где находится исполняемый файл приложения.

Подтвержденный ответ

Чтобы решить проблему, необходимо использовать функцию CreateProcess, которая позволяет задать рабочую директорию для процесса. Также рекомендуется отказаться от использования Sleep, так как это не является надежным способом ожидания завершения процесса. Вместо этого следует дождаться сигнала от процесса через его дескриптор.

Альтернативный подход

Для более продвинутого подхода можно создать процесс MAME64 напрямую и использовать анонимный канал, созданный как стандартный вывод (stdout), что позволит избежать записи файлов.

Пример кода

var
  pi: TProcInfo;
  si: TStartupInfo;
begin
  si.cb := SizeOf(TStartupInfo);
  si.dwFlags := STARTF_USESHOWWINDOW;
  si.wShowWindow := SW_HIDE;
  si.cbReserved2 := 0;
  si.lpReserved2 := nil;
  si.dwFlags := STARTF_USESTDHANDLES;
  si.hStdOutput := GetStdHandle(STD_OUTPUT_HANDLE);
  if CreateProcess(nil, PChar('/C ' + vDir + ' -listfull'), nil, nil, TRUE, 0, nil, vDir2, si, pi) then
  begin
    WaitForSingleObject(pi.hProcess, INFINITE);
    // Ожидание завершения процесса
  end;
end;

Заключение

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

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

Проблема использования `ShellExecute` для запуска MAME64 в Delphi и необходимость перехода к использованию `CreateProcess` для корректного управления процессами и рабочей директорией.


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

Получайте свежие новости и обновления по 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 16:20:54/0.0051059722900391/1