首页 > 解决方案 > Delphi:如何创建一个独立于主应用程序的分离进程?

问题描述

从我的应用程序中,我需要创建一个独立于主应用程序的分离进程。这意味着,如果用户关闭主应用程序,新进程仍然处于活动状态。我不需要等待新进程的输出,然后我可以创建一个新进程而无需等待响应。

在此处输入图像描述

目的是创建一个单独的管道来完成长时间操作,而无需等待结束,并且如果主应用程序终止,则无需终止。

基本上,这段代码看到的作品。

uses ShellApi;

begin
  ShellExecute(0, 'open', PChar('MyConsole.EXE'), PChar('MyParam'), '', SW_HIDE);
end;

但是,我有疑问,该进程是从从主应用程序加载的 DLL 中生成的,并且ShellExecute需要一个HWND,从 DLL 中生成一个新进程是否合适ShellExecute

谢谢,抱歉英语不好!

标签: delphi

解决方案


我想分享解决方案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.

推荐阅读