Delphi - ShellExecute vs. MessageDlg

Sziasztok!

Azt szeretném megvalósítani, hogy ShellExecute-tal meghívok egy .bat file-t, és ha az végzett, legyen visszacsatolás erről 1 MessageDlg formájában. Jelenleg csak egymás után van felsorolva a 2 művelet, de ezzel csak az a bökkenő, hogy még javában nyitva van a cmd ablak, amikor már kapom az üzenetet, hogy befejezte. Van erre valamilyen megoldás? Hogyan lehet "megmondani" a Delphinek, hogy csak a cmd ablak automatikus bezárása után jöjjön a MessageDlg ablak?

Előre is köszönöm a válaszokat!

Hozzászólások

delphi shellexecute wait

procedure ExecuteAndWait(const aCommand: string);
var
  tmpStartupInfo: TStartupInfo;
  tmpProcessInformation: TProcessInformation;
  tmpProgram: String;
begin
  tmpProgram := trim(aCommand);
  FillChar(tmpStartupInfo, SizeOf(tmpStartupInfo), 0);
  with tmpStartupInfo do
  begin
    cb := SizeOf(TStartupInfo);
    wShowWindow := SW_HIDE;
  end;

  if CreateProcess(nil, pchar(tmpProgram), nil, nil, true, CREATE_NO_WINDOW,
    nil, nil, tmpStartupInfo, tmpProcessInformation) then
  begin
    // loop every 10 ms
    while WaitForSingleObject(tmpProcessInformation.hProcess, 10) > 0 do
    begin
      Application.ProcessMessages;
    end;
    CloseHandle(tmpProcessInformation.hProcess);
    CloseHandle(tmpProcessInformation.hThread);
  end
  else
  begin
    RaiseLastOSError;
  end;
end;

--
[ Falu.me | Tárhely | A Linux és én ]

Köszönöm a kódrészletet!

Ha csak simán beillesztem, elindul a program, de nem azt csinálja, amit szeretnék. Ez persze rendben is van így, mert nem hivatkozok rá sehol.

Viszont, ha fönt a type-nál beírom, hogy procedure ExecuteAndWait(const aCommand: string); már hibát dob: unsatisfied forward or external declaration.

Gondoltam az a baja, hogy nincs deklarálva az "aCommand" nevű konstans. De itt meg azért akadtam el, hogy akkor milyen értéket kell neki adni?

Ennél a példánál a string típusú vektorban pl. a 3 nap van:
const Days : array[0..3] of string = ('Sat','Sun', 'Mon' );
Én eddig csak értékadással tanultam konstans megadást.

Az én ide vonatkozó kódrészletem ez lenne:

procedure TForm1.save(Sender: TObject);
var s:string;
begin
s:='c:\Program Files\save\save.bat';
ShellExecute(handle, 'open' ,pchar(s),nil, pchar(extractfilepath(s)), SW_SHOWNORMAL) ;
MessageDlg('A mentés befejeződött.', mtInformation, [mbyes],0);
end;

Az egymásnak megfeleltetés tekintetében szerintem az "aCommand" felelne meg az én "s" változómnak, csak az nem lokális lenne, hanem 1 globális konstans. Jól gondolom?