Запуск и завершение процессов
То, что я понаписал нельзя считать цивильным кодом...просто демонстрация работы функции WaitForMultipleObjects ( код позорный...просто жуть...)
- Подробности
- Родительская категория: Процессы, потоки, память, задачи
- Категория: Запуск и завершение процессов
Code: |
var pi : TProcessInformation; si : TStartupInfo; begin ZeroMemory(@si,sizeof(si)); si.cb:=SizeOf(si); if not CreateProcess( PChar(lpApplicationName), //pointer to name of executable module PChar(lpCommandLine), // Command line. nil, // Process handle not inheritable. nil, // Thread handle not inheritable. False, // Set handle inheritance to FALSE. 0, // No creation flags. nil, // Use parent's environment block. nil, // Use parent's starting directory. si, // Pointer to STARTUPINFO structure. pi ) // Pointer to PROCESS_INFORMATION structure. then begin Result:=false; RaiseLastWin32Error; Exit; end; WaitForSingleObject(pi.hProcess,INFINITE); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); // ... здесь твой код end; |
Автор ответа: TAPAKAH
Примечание Vit:
Если заменить
WaitForSingleObject(pi.hProcess,INFINITE);
на
while WaitforSingleObject(PI.hProcess,200)=WAIT_TIMEOUT do application.ProcessMessages;
то вызывающая программа не будет казаться завешанной и будет отвечать на сообщения
Примечание Mikel: В RxLib есть функция для этого: FileExecuteWait
- Подробности
- Родительская категория: Процессы, потоки, память, задачи
- Категория: Запуск и завершение процессов
Процедура AddTerminateProc( TermProc: TTerminateProc);
Добавляет процедуру в системный список процедур "завершения программы" (termination procedures list), которые вызываются перед окончанием работы приложения. Каждая такая процедура должна возвращать True, когда приложение может быть беспроблемно завершено или False, если приложение не должно быть завершено. Если любая из указанных процедур возвращает False, то выполнение приложения завершено не будет.
Функция CallTerminateProcs: Boolean;
Функция вызывает все подпрограммы, указанные в списке процедур завершения программы (termination procedures list). Если все процедуры и функции списка возвращают True, то CallTerminateProcs возвращает True, в остальных случаях функция возвращает False. Функция CallTerminateProcs вызывается внутренне непосредственно перед завершением выполнения приложения.
- Подробности
- Родительская категория: Процессы, потоки, память, задачи
- Категория: Запуск и завершение процессов
блоке begin..end модуля .dpr:
Code: |
begin if HPrevInst <> 0 then begin ActivatePreviousInstance; Halt; end; end; |
- Подробности
- Родительская категория: Процессы, потоки, память, задачи
- Категория: Запуск и завершение процессов
Должно работать, только лучше указывать полный путь до папки запускаемого приложения... без этого у меня некоторые приложения не запускались(один из параметров после 'notepad').
- Подробности
- Родительская категория: Процессы, потоки, память, задачи
- Категория: Запуск и завершение процессов