如何在VC++中包含CreateProcess API的参数?

use*_*879 0 c++ winapi mfc visual-c++

我使用createprocess API从我的主应用程序调用了另一个应用程序.但另一个过程也需要一些参数作为参数.

我创建了以下过程:

BOOL ret= CreateProcess( NULL, szCmdline, NULL, NULL, TRUE, 0, NULL, NULL,&siStartInfo, &piProcInfo);  
Run Code Online (Sandbox Code Playgroud)

szCmdline是变量,它包含应用程序的完整路径.

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

谢谢,

Jon*_*ter 5

CreateProcess包含lpApplicationName和szCommandLine参数.您必须至少传递一个参数.但是出于安全原因,您应该通过这两个.

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

  • 如果你通过NULLlpApplicationName,系统会尝试在定位可执行szCommandLine,并会使用它.

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

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

如果lpApplicationName为NULL,则命令行的第一个以空格分隔的标记指定模块名称.如果使用包含空格的长文件名,请使用带引号的字符串来指示文件名的结束位置和参数的开始(请参阅lpApplicationName参数的说明).

最好同时传递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参数,则不会发生这种情况.