Delphi:如何创建独立于主应用程序的独立进程?
从我的应用程序中,我需要创建一个独立于主应用程序的分离进程。这意味着,如果用户关闭主应用程序,新进程仍处于活动状态。我不需要等待新流程的输出,那么我就可以创建一个新流程,而无需等待响应 目的是创建一个单独的管道,用于完成长时间的操作,无需等待结束,如果主应用程序终止,也无需终止。 基本上,这段代码可以正常工作Delphi:如何创建独立于主应用程序的独立进程?,delphi,Delphi,从我的应用程序中,我需要创建一个独立于主应用程序的分离进程。这意味着,如果用户关闭主应用程序,新进程仍处于活动状态。我不需要等待新流程的输出,那么我就可以创建一个新流程,而无需等待响应 目的是创建一个单独的管道,用于完成长时间的操作,无需等待结束,如果主应用程序终止,也无需终止。 基本上,这段代码可以正常工作 uses ShellApi; begin ShellExecute(0, 'open', PChar('MyConsole.EXE'), PChar('MyParam'), '',
uses ShellApi;
begin
ShellExecute(0, 'open', PChar('MyConsole.EXE'), PChar('MyParam'), '', SW_HIDE);
end;
但是,我有一个疑问,该进程是从主应用程序加载的DLL生成的,ShellExecute
需要一个HWND
,从带有ShellExecute
的DLL生成新进程是否合适
谢谢,抱歉英语不好 我想分享与
CreateProcess
一起制作的解决方案(感谢@DavidHeffernan)
ShellExecute
不适合生成新进程,因为该进程是从主应用程序加载的DLL生成的,ShellExecute
需要HWND
function RunProcess(ACommand: string): boolean;
var
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
begin
UniqueString(ACommand); // CreateProcess requires writeable string for lpCommandLine arg
FillChar(StartupInfo, SizeOf(StartupInfo), #0);
StartupInfo.cb := SizeOf(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
StartupInfo.wShowWindow := SW_HIDE;
Result := CreateProcess(nil, PChar(ACommand), nil, nil, False, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo);
if Result then
begin
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
end;
end;
// ...
begin
if not(RunProcess('MyConsoleApp.exe')) then
raise Exception.Create('RunProcess failed');
end.
使用
CreateProcess
创建新进程,不要使用ShellExecute
。传递给ShellExecute
的窗口句柄仅用作显示的任何对话框的所有者窗口,但不会有任何对话框。进程将不会以任何方式连接,Windows不像*nix那样具有父/子进程的概念。如果两个应用程序都是控制台模式的应用程序,那么它们将共享一个控制台,但我认为这里不是这种情况。@DavidHeffernan谢谢david!我可以创建进程而不必等待SingleObject并立即关闭句柄?是的,你可以…这是我问题的答案,谢谢@DavidHeffernan我已经用解决方案更新了这个问题。谢谢!您不需要测试CreateProcess的返回值。此外,您还可以获得一个以空结尾的字符串,该字符串带有PChar(AFileName)
,如果字符串为空,则可以避免范围错误。最后,您需要使用UniqueString使字符串可写。我认为您首先需要解释为什么ShellExecute不适合从DLL生成新进程。否则我看不出这是如何回答这个问题的。@DavidHeffernan我已经用PChar(ACommand)进行了更新,但我不明白如何使用UniqueString和测试返回值。。。抱歉..ProcessInfo
仅在CreateProcess
返回true时才保证填充。并且lpCommandLine arg必须是可写的,因此需要进行校准。我将为您编辑答案。谢谢您的编辑。但是,您提供的信息不正确。ShellExecute不关心,也不知道它是从dll调用的还是其他调用的。此外,ShellExecute不需要窗口句柄。