c++ - 如何在 VC++ 中使用 CreateProcess API 包含参数?

标签 c++ winapi visual-c++ mfc

我已经使用 createprocess API 从我的主应用程序调用了另一个应用程序。但是其他进程也需要一些参数作为参数。

我将流程创建为:

BOOL ret= CreateProcess( NULL, szCmdline, NULL, NULL, TRUE, 0, NULL, NULL,&siStartInfo, &piProcInfo);  

szCmdline 是包含应用程序完整路径的变量。

知道如何通过这个过程传递参数。

谢谢,

最佳答案

CreateProcess 有 lpApplicationName 和 szCommandLine 参数。您必须至少传递一个参数。但是,出于安全原因,您应该同时通过这两项。

  • lpApplicationName 是您希望运行的可执行文件的名称。
  • szCommandLine 是您希望传递给该可执行文件的命令行。它应该包括可执行文件作为第一项。这将作为 WinMain 的参数由应用程序接收,或由 GetCommandLine 函数检索(尽管如果未提供,系统可能会预先添加完全限定路径)。对于使用 mainwmain 的 C 程序,CRT 会将其解析为参数。

  • 如果您为 lpApplicationName 传递 NULL,系统将尝试在 szCommandLine 中找到可执行文件,并将使用它。

  • 如果您为 szCommandLine 传递 NULL,系统将对两者都使用 lpApplicationName

所以命令行就是命令行。如果您有要传递给命令的参数,请将它们放在命令行中。

If lpApplicationName is NULL, the first white space–delimited token of the command line specifies the module name. If you are using a long file name that contains a space, use quoted strings to indicate where the file name ends and the arguments begin (see the explanation for the lpApplicationName parameter).

最好同时传递 lpApplicationName 和 szCommandLine,以确保命令行不会被系统错误解释并运行错误的可执行文件。 (几年前就有一类由此引发的安全问题)。

此外,当同时传递 lpApplicationName 和 szCommandLine 时,请记住 szCommandLine 仍然需要将应用程序名称作为第一个参数。

例如,如果您的程序是 C:\Program Files\My Application\Program.exe 并且参数是 /the/arguments,您将设置 lpApplicationName到 "C:\Program Files\My Application\Program.exe",并将 szCmdline 设置为 "C:\Program Files\My Application\Program.exe "/the/arguments.

安全问题是什么?

想象一下,如果有人创建了一个文件“C:\Program Files\My.exe”。如果省略引号,系统会将 C:\Program Files\My Application\Program.exe/the/arguments 解释为:C:\Program Files\My.exe Application\Program。 exe/the/arguments.你会得到一个惊喜。这种类型的技巧可以用来欺骗管理员运行他们不想运行的程序,这是一个安全问题。如果您传递 lpApplicationName 参数,则不会发生这种情况。

关于c++ - 如何在 VC++ 中使用 CreateProcess API 包含参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19398606/

相关文章:

c++ - 为什么 pair 在初始化时不需要类型

c++ - 尝试从 VC++ 使用 matlab 引擎时出错

c++ - 按名称链接导入 (C++/Visual Studio)

c++ - LoadLibraryA 失败,未找到模块,但文件名正确

c++ - 在 Windows 错误检查上使用 C++ 将电子邮件发送到 gmail 帐户

c++ - x64 转换后指针截断

c++ - 如何在 c 中的 opencv 2.3 编码中向序列添加元素

c++ - 使用 boost::accumulators::statistics 查找数组的中位数

c++ - 为什么 NetUserGetInfo 不给我用户主目录?

c++ - MFC:通过发布消息触发菜单操作需要什么?