Sto utilizzando una procedura fornita che eseguirà un processo ma voglio che il processo venga eseguito in background senza che la finestra venga visualizzata. La chiamata èNascondere la finestra del processo con 'CreateProcess'
ExecProcess(ProgPath, '', False);
e la funzione è
function ExecProcess(ProgramName, WorkDir: string; Wait: boolean): integer;
var
StartInfo: TStartupInfo;
ProcInfo: TProcessInformation;
CreateOK: boolean;
ExitCode: integer;
dwExitCode: DWORD;
begin
ExitCode := -1;
FillChar(StartInfo, SizeOf(TStartupInfo), #0);
FillChar(ProcInfo, SizeOf(TProcessInformation), #0);
StartInfo.cb := SizeOf(TStartupInfo);
if WorkDir <> '' then
begin
CreateOK := CreateProcess(nil, Addr(ProgramName[1]), nil, Addr(WorkDir[1]),
false, CREATE_NEW_PROCESS_GROUP + NORMAL_PRIORITY_CLASS, nil, nil,
StartInfo, ProcInfo);
end
else
begin
CreateOK := CreateProcess(nil, Addr(ProgramName[1]), nil, nil, false,
CREATE_NEW_PROCESS_GROUP + NORMAL_PRIORITY_CLASS, nil, Addr(WorkDir[1]),
StartInfo, ProcInfo);
end;
{ check to see if successful }
if CreateOK then
begin
// may or may not be needed. Usually wait for child processes
if Wait then
begin
WaitForSingleObject(ProcInfo.hProcess, INFINITE);
GetExitCodeProcess(ProcInfo.hProcess, dwExitCode);
ExitCode := dwExitCode;
end;
end
else
begin
ShowMessage('Unable to run ' + ProgramName);
end;
CloseHandle(ProcInfo.hProcess);
CloseHandle(ProcInfo.hThread);
Result := ExitCode;
end;
Ho provato ad utilizzare l'attributo StartInfo.wShowWindow
con SW_MINIMIZE
, SW_FORCEMINIMIZE
e SW_SHOWMINIMIZED
ma non è funzionante. Vedo che l'attributo sta cambiando nel debugger ma questo è quanto ho capito adesso. Qualcuno potrebbe indicare qual è il problema?
EDIT: Se è importante eseguo un paio di moduli Fortran (.exe) con argomenti che apriranno una finestra CMD.
è l'altra console processo o GUI App? Hai problemi con vars firmati e non firmati sul codice di uscita. Il secondo parametro di CreateProcess deve essere scrivibile. Usa UniqueString per quello. –
Non usare '+' per unire i flag 'CREATE_NEW_PROCESS_GROUP + NORMAL_PRIORITY_CLASS', devi usare l'operatore' or', come 'CREATE_NEW_PROCESS_GROUP o NORMAL_PRIORITY_CLASS'. In questo caso il risultato è lo stesso, ma in molti casi non lo è. – kibab
Oltre a ciò che David ha detto su 'UniqueString()', dovresti usare anche 'PChar (ProgramName)' invece di 'Addr (ProgramName [1])'. –