
The first point I would make is that you went to an awful lot of trouble
to implement the WinExec API call...  cleaner code would look like:

begin
  winexec('C:\Program.exe', SW_SHOWNORMAL);
end;

Delphi automatically treats this as a null-terminated string (like c).  As
to the answer to your question.  WinExec returns a handle to the
task.  Simply do the following:

procedure SomeProc;
var
  ProgramHandle : THandle;
begin
  ProgramHandle := WinExec('C:\Program.exe', SW_SHOWNORMAL);
  while GetModuleusage(ProgramHandle) <> 0 do application.processmessages;
  {The above line will loop until the program terminates}
  {continue on with program below here}
end;
