【问题标题】:How to start a process from within another process that isn't a child process?如何从另一个不是子进程的进程中启动一个进程?
【发布时间】:2015-04-15 09:14:51
【问题描述】:

我有一个有趣的场景。我的执行过程是QtAgent32.exe(基本上用于自动化测试)。

我有启动被测应用程序的代码。如果我在运行此 EnsureAppIsRunning() 方法之前手动启动应用程序 - 然后它会从如下进程中获取应用程序:

_application = ApplicationUnderTest.FromProcess(processes[0]);

现在在测试运行结束时,QtAgent32.exe 关闭并终止应用程序 - 仅当应用程序是在进程中创建时。

再次重申,如果我手动打开了应用程序,那么它会使其保持活动状态 - 这是我想要的行为。

所以为了尝试解决这个问题,我使用了 Process.Start(),还尝试了 UseShellExecute - 这不起作用。

然后我转到非托管路线:

STARTUPINFO si = new STARTUPINFO();
            PROCESS_INFORMATION pi = new PROCESS_INFORMATION();
            CreateProcess(Constants.ApplicationUndertestPath, null, IntPtr.Zero, IntPtr.Zero, false, 0, IntPtr.Zero, null, ref si, out pi);

我的问题是,如何从 C# 启动和应用程序,以便将其视为完全成熟的外部进程(就像我手动启动它一样)。这样 QtAgent32 就不会在以后作为子进程将其杀死。

【问题讨论】:

标签: c#


【解决方案1】:

想到的唯一方法是通过使用代理可执行文件,您的应用程序启动代理 - 然后成为您进程的子进程 - 代理启动所需的应用程序,然后退出。

您可以使用与 C# 中相同的 CreateProcess 方法 - 我正在使用以下本机代码来实现相同的目的:

CreateProcess(nullptr, pCommandLine.get(), nullptr, nullptr, FALSE, CREATE_SUSPENDED, nullptr, dir.c_str(), &inf, &pinf))

【讨论】:

    【解决方案2】:

    我使用资源管理器作为代理:

    ProcessStartInfo processInfo;
    
    processInfo = new ProcessStartInfo("explorer.exe", Constants.ApplicationUndertestPath);
    processInfo.UseShellExecute = false;
    processInfo.RedirectStandardError = false;
    processInfo.RedirectStandardOutput = false;
    
    Process.Start(processInfo);
    

    【讨论】:

      猜你喜欢
      • 2015-03-22
      • 1970-01-01
      • 1970-01-01
      • 2022-06-14
      • 1970-01-01
      • 1970-01-01
      • 2012-05-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多