【问题标题】:system() and CreateProcess() / CreateProcessW()system() 和 CreateProcess() / CreateProcessW()
【发布时间】:2023-04-06 07:27:01
【问题描述】:

我想在 C 程序中执行 TEST.exe。当我使用

system( "TEST.exe <input-file> output-file" );

我可以得到我所期望的。

但是当我使用以下代码时,CreateProcessW() 无法正常工作(参见How do I run an external program?):

if (CreateProcessW(const_cast<LPCWSTR>(FullPathToExe.c_str()), 
    pwszParam, 0, 0, false, 
    CREATE_DEFAULT_ERROR_MODE, 0, 0, 
    &siStartupInfo, &piProcessInfo) != false) 
{ 
    /* Watch the process. */ 
    dwExitCode = WaitForSingleObject(piProcessInfo.hProcess,  (SecondsToWait * 1000)); 
    iReturnVal = GetLastError(); 
} 
else 
{ 
    /* CreateProcess failed */ 
    iReturnVal = GetLastError(); 
} 

在哪里

FullPathToExe="TEST.exe", pwszParam="TEST.exe <input-file> output-file".

而WaitForSingleObject()返回258,GetLastError()返回1813(“图片文件中找不到指定的资源类型”)。

另外,上面的 CreateProcessW() 代码在我运行我自己的 HelloProcess.exe 时工作正常(打印你好,然后休眠几秒钟,由以下数字确定,然后退出。)

FullPathToExe="HelloProcess.exe", pwszParam="HelloProcess.exe 10".

有什么想法吗?感谢您的任何提示!

【问题讨论】:

  • FullPathToExe 是字符串还是 wstring?
  • 这是一个字符串。我认为变量的类型还可以,因为代码使用我自己的 *.exe 运行良好。不知道是不是参数中的“"有问题?
  • 标题应更改为“输入/输出重定向:system() vs. CreateProcess()”,但我不允许编辑它。在&lt;input-file&gt; output-file 中,间距也是无关紧要的——因此会产生误导。字符 &lt;&gt; 是前缀,但 OP 的间距意味着它们是括号。不会误导的间距:&lt;output-file &gt;input-file.

标签: windows system createprocess external-process


【解决方案1】:

WaitForSingleObject() 返回一个等待结果,而不是退出代码。 https://msdn.microsoft.com/en-us/library/windows/desktop/ms687032(v=vs.85).aspx

258 是 WAIT_TIMEOUT。您应该重试此错误代码,直到返回值为 0 (WAIT_OBJECT_0) 或其他错误。

在此之后,使用 GetExitCodeProcess https://msdn.microsoft.com/en-us/library/windows/desktop/ms683189(v=vs.85).aspx 获取进程的退出代码。

【讨论】:

    【解决方案2】:

    我做什么CreateProcess and command line arguments 告诉我做,并解决问题!谢谢大家的关注!

    为了您的方便,这里引用答案:

    您不能在 CreateProcess() 中使用命令行重定向运算符 直接地。您必须生成一个 cmd.exe 实例并通过 运算符改为它,例如:

    CreateProcess( "C:\\windows\\system32\\cmd.exe", t_str2, ...)) 
    

    在哪里 t_str2 是“/C C:\Temp\sift.exe C:\img1.key”。这 cmd.exe 的实际路径可以通过读取 %COMSPEC% 来确定 环境变量。

    【讨论】:

      【解决方案3】:

      system 实际上会生成一个运行您的命令的cmd 实例:

      system 函数将命令传递给命令解释器,命令解释器将字符串作为操作系统命令执行。 system 指的是 COMSPECPATH 环境变量,用于定位命令解释器文件(Windows NT 中名为 CMD.EXE 的文件)。如果 command 为 NULL,该函数只检查命令解释器是否存在。
      ——Documentation of system

      这就是 &lt;&gt; 等重定向运算符起作用的原因。 CreateProcess 的情况并非如此,它实际上只是生成一个进程而不是一个执行另一个进程的 shell。由于重定向操作符是 shell 的一项功能,而不是操作系统的功能,因此您必须手动对进程进行输入和输出。

      【讨论】:

      • 非常感谢您的解释。我现在找到了解决问题的方法,万岁!!
      猜你喜欢
      • 2010-09-13
      • 1970-01-01
      • 2014-02-12
      • 1970-01-01
      • 1970-01-01
      • 2010-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多