Вопрос
Буду очень благодарен, если вы объясните мне как я могу из своей програмки запустить exe'шный файл.
Ответ
Есть два варианта.
первый:
ShellExecute(nil, nil, PChar(«d:\MyExe.exe»), nil,PChar(«d:\WorkingDirectory»), SW_SHOW);
тут ты просто вызываешь на выполнение, можно и не ехешник, тогда откроется умолчательное приложение (например Word для .doc файла)
второй:
тут возможностей много больше, например можно дождаться завершения
// Запуск архиватора. procedure RunExtern(ComStr: String); //ComStr — путь до ехешника var SI: TStartupInfo; PI: TProcessInformation; begin // Готовимся к запуску FillChar(SI, 0, sizeof(SI)); SI.cb := sizeof(SI); SI.dwFlags:= STARTF_USESHOWWINDOW; SI.wShowWindow:=SW_HIDE; // SW_SHOW — чтобы окно было видно на экране // SW_HIDE — чтобы окно было НЕ видно на экране // Запускаем архиватор if(CreateProcess(nil, PChar(ComStr), nil, nil, false, CREATE_DEFAULT_ERROR_MODE, nil, PChar(ComStr), // тут можно указать рабочий каталог программы SI, PI)) then begin // Если удачно запустился, сразу грохаем описатель потока… CloseHandle(PI.hThread); // ----------------------------// этот кусок для ожидания завершения программы // иначе просто нужно убрать все от сиз пор… // и ждем, до завершения или 20 секунд, чтобы изменить интервал // — смотри число ниже. Чтобы ждать бесконечно (т.е. пока не // завершится) вместо числа INFINITE. if(WaitForSingleObject(PI.hProcess, 20000) = WAIT_TIMEOUT) then //ждем begin // не дождались, будем терминировать процесс… ShowMessage('Ошибка ожидания.'); TerminateProcess(PI.hProcess, 1); end; // и до сих пор… // — CloseHandle(PI.hProcess); // Закрываем описатель потока. end else ShowMessage('Ошибка запуска…'); end;
если в ComStr передавать длинные имена каталогов, то лучше перед запуском (с целью перестраховки) получить из них короткие пути, вызвав функцию GetShortPathName. Но должно работать и без этого… выбирай тот, который тебе нужнее…
Из конференции Expert_FAQ
Copyright 2000-2004 Сообщество Чайников
Контактная информация