То, что я понаписал нельзя считать цивильным кодом...просто демонстрация работы функции 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').