创建进程lpApplicationName vs lpCommandLine

CreateProcess - lpApplicationName vs lpCommandLine

本文关键字:lpCommandLine vs lpApplicationName 进程 创建      更新时间:2023-10-16

我一直在使用CreateProcess Win API,我想知道使用lpApplicationName和lpCommandLine参数与lpCommandLine参数之间的区别是什么。

例如:

CreateProcess(NULL, L"C:PathToNotepad.exe", L"C:PathToFileToLoad.txt"... etc
CreateProcess(NULL, NULL, L"C:PathToNotepad.exe C:PathToFileToLoad.txt"... etc

我假设第二个选项,其中只使用lpCommandLine,就像打开cmd.exe并运行该行一样。但是第一行呢,它是否加载应用程序并以不同的方式指定命令行参数?

我看了一下API的MSDN文档,但它似乎没有真正详细说明发生了什么,参数可以包含什么,这很好,但我只是很困惑,当有多种方法可以做到这一点时,我应该做什么。

请注意,我知道这两个示例行可能不工作,因为lpCommandLine需要LPTSTR,而不是LPCTSTR。这只是为了便于理解。

非常感谢您的帮助!

安迪

建议同时使用两个参数。如果不指定lpApplicationName,则让Windows解析lpCommandLine以找出应用程序名称。因为空间是文件名和目录名中的有效字符,这可能(在极少数情况下)导致运行错误的应用程序。(例如,如果你有c:program.exe,你在Windows XP的c:program files下启动一个程序)。

在这两种情况下,您都应该使用lpCommandLine中的应用程序名称,因为它用于计算Argv[0]。

我从不使用lpApplicationName,总是引用lpCommandLine的应用程序部分,在你的例子中,我会执行"C:PathToNotepad.exe" "C:PathToFileToLoad.txt"(引用传递给CreateProcess的所有路径是一个好主意)只是使用lpApplicationName会导致访问argv[0]的子进程出现问题,这就是为什么我远离它。


<rant>在你自己以外的任何地方使用CreateProcess都可能有问题,因为NT6+可以在任何时候决定你正在执行的事情需要管理员权限,因为应用程序兼容性缺陷和/或安装程序检测,然后CreateProcess就失败了。除非你需要使用调试或脱离作业标志,否则我建议为了安全起见,只调用ShellExecute[Ex]。</rant>

根据MSDN, lpApplicationName是可选的,可以是NULL。在这种情况下,模块名必须是lpCommandLine字符串中第一个以空格分隔的令牌。

如果可执行模块是16位应用程序,lpApplicationName应该为NULL, lpCommandLine指向的字符串应该指定可执行模块及其参数。