我正在使用提供給我的程序來運行一個進程,但我希望進程在後臺運行而不顯示窗口。電話是使用'CreateProcess'隱藏進程窗口
ExecProcess(ProgPath, '', False);
而且功能
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;
我曾嘗試使用StartInfo.wShowWindow
屬性與SW_MINIMIZE
,SW_FORCEMINIMIZE
和SW_SHOWMINIMIZED
,但它不工作。我可以看到該屬性在調試器中發生了變化,但這與我目前所瞭解的一樣。有人能指出問題是什麼嗎?
編輯:如果它很重要我正在執行一些Fortran模塊(.exe)與參數,將打開一個CMD窗口。
的使用是其他程序控制臺或GUI應用程序?退出代碼中的簽名和未簽名變量有問題。 CreateProcess的第二個參數必須是可寫的。爲此使用UniqueString。 – 2014-11-06 10:12:42
不要使用'+'來合併標誌'CREATE_NEW_PROCESS_GROUP + NORMAL_PRIORITY_CLASS',你必須使用'或'運算符,比如'CREATE_NEW_PROCESS_GROUP或NORMAL_PRIORITY_CLASS'。在這種情況下,結果是一樣的,但在很多情況下,結果是一樣的。 – kibab 2014-11-06 10:37:35
除了David關於'UniqueString()'的說法外,還應該使用'PChar(ProgramName)'而不是'Addr(ProgramName [1])'。 – 2014-11-06 18:13:39