我已经使用 createprocess API 从我的主应用程序调用了另一个应用程序。但是其他进程也需要一些参数作为参数。
我将流程创建为:
BOOL ret= CreateProcess( NULL, szCmdline, NULL, NULL, TRUE, 0, NULL, NULL,&siStartInfo, &piProcInfo);
szCmdline 是包含应用程序完整路径的变量。
知道如何通过这个过程传递参数。
谢谢,
最佳答案
CreateProcess 有 lpApplicationName 和 szCommandLine 参数。您必须至少传递一个参数。但是,出于安全原因,您应该同时通过这两项。
lpApplicationName
是您希望运行的可执行文件的名称。szCommandLine
是您希望传递给该可执行文件的命令行。它应该包括可执行文件作为第一项。这将作为WinMain
的参数由应用程序接收,或由GetCommandLine
函数检索(尽管如果未提供,系统可能会预先添加完全限定路径)。对于使用main
或wmain
的 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/