Tôi đang sử dụng quy trình được cung cấp cho tôi để chạy quy trình nhưng tôi muốn quy trình chạy trong nền mà không có cửa sổ hiển thị. Cuộc gọi làẨn cửa sổ quy trình với 'CreateProcess'
ExecProcess(ProgPath, '', False);
và chức năng là
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;
tôi đã cố gắng sử dụng thuộc tính StartInfo.wShowWindow
với SW_MINIMIZE
, SW_FORCEMINIMIZE
và SW_SHOWMINIMIZED
nhưng nó không được làm việc. Tôi có thể thấy rằng thuộc tính đang thay đổi trong trình gỡ rối nhưng đó là nhiều như tôi hiểu ngay bây giờ. Ai đó có thể chỉ ra vấn đề là gì?
EDIT: Nếu vấn đề tôi thực hiện một vài mô-đun Fortran (.exe) với các đối số sẽ mở ra một cửa sổ CMD.
là quá trình điều khiển hoặc GUI ứng dụng khác? Bạn có vấn đề với các ký hiệu đã ký và chưa ký trên mã thoát. Tham số thứ hai của CreateProcess phải được ghi. Sử dụng UniqueString cho điều đó. –
Không sử dụng '+' để hợp nhất cờ 'CREATE_NEW_PROCESS_GROUP + NORMAL_PRIORITY_CLASS', bạn phải sử dụng toán tử' hoặc', như 'CREATE_NEW_PROCESS_GROUP hoặc NORMAL_PRIORITY_CLASS'. Trong trường hợp này kết quả là như nhau, nhưng trong nhiều trường hợp nó sẽ không. – kibab
Ngoài những gì David đã nói về 'UniqueString()', bạn cũng nên sử dụng 'PChar (ProgramName)' thay vì 'Addr (ProgramName [1])'. –