【发布时间】:2014-11-06 09:26:21
【问题描述】:
我正在使用提供给我的程序来运行一个进程,但我希望该进程在后台运行而不显示窗口。电话是
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 or NORMAL_PRIORITY_CLASS, nil, nil,
StartInfo, ProcInfo);
end
else
begin
CreateOK := CreateProcess(nil, Addr(ProgramName[1]), nil, nil, false,
CREATE_NEW_PROCESS_GROUP or 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。
-
不要使用
+合并标志CREATE_NEW_PROCESS_GROUP + NORMAL_PRIORITY_CLASS,必须使用or运算符,如CREATE_NEW_PROCESS_GROUP or NORMAL_PRIORITY_CLASS。在这种情况下结果是相同的,但在许多情况下它不会。 -
除了大卫所说的
UniqueString(),你还应该使用PChar(ProgramName)而不是Addr(ProgramName[1])。
标签: delphi delphi-xe5