我一直在使用CreateProcess Win API,我想知道将lpApplicationName和lpCommandLine用于参数v.s.之间的区别是什么。只是lpCommandLine参数。
例如:
CreateProcess(NULL, L"C:\Path\To\Notepad.exe", L"C:\Path\To\File\To\Load.txt"... etc
CreateProcess(NULL, NULL, L"C:\Path\To\Notepad.exe C:\Path\To\File\To\Load.txt"... etc
我假设第二个选项,只使用lpCommandLine就像打开cmd.exe并运行那条确切的行一样。但是第一行呢,是加载应用程序并以不同方式指定命令行参数吗?
我已经查看了API的MSDN文档,但它似乎并没有详细说明发生了什么,这些参数可以包含什么,这很好,但我只是对我应该是什么感到困惑当有多种方法时这样做。
请注意,我知道两个采样行可能不起作用,因为lpCommandLine需要LPTSTR,而不是LPCTSTR。它只是为了便于理解。
非常感谢您的帮助!
安迪
答案 0 :(得分:4)
推荐的方法是使用这两个参数。如果未指定lpApplicationName,则让Windows解析lpCommandLine以确定应用程序名称。由于空间是文件名和目录名中的有效字符,因此(在极少数情况下)会导致运行错误的应用程序。 (例如,如果您有c:\ program.exe并且在Windows XP中的c:\ program files下启动程序)。
在这两种情况下,您都应该在lpCommandLine中使用应用程序名称,因为这用于计算Argv [0]。
答案 1 :(得分:3)
我从不使用lpApplicationName并始终引用lpCommandLine的应用程序部分,在您的示例中我将执行"C:\Path\To\Notepad.exe" "C:\Path\To\File\To\Load.txt"
(引用传递给CreateProcess的所有路径是一个好主意)仅使用lpApplicationName会导致访问的子进程出现问题argv [0]这就是我远离它的原因。
<rant>
在除了你自己以外的任何事情上使用CreateProcess可能会有问题,因为NT6 +可以在任何时候决定你正在执行的东西需要管理员权限,因为应用程序兼容性垫片和/或安装程序检测,然后CreateProcess失败。除非你需要使用调试或脱离作业标志,否则我建议只是调用ShellExecute [Ex]来保证安全...... </rant>
答案 2 :(得分:1)
According to MSDN, lpApplicationName 是可选的,可以为NULL。在这种情况下,模块名称必须是lpCommandLine字符串中第一个以空格分隔的标记。
如果可执行模块是16位应用程序,则lpApplicationName应为NULL,lpCommandLine指向的字符串应指定可执行模块及其参数。