Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi:如何创建独立于主应用程序的独立进程?_Delphi - Fatal编程技术网

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不需要窗口句柄。