创建进程lpApplicationName vs lpCommandLine
CreateProcess - lpApplicationName vs lpCommandLine
我一直在使用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指向的字符串应该指定可执行模块及其参数。
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 数据成员SFINAE的C++17测试:gcc vs clang
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 正在VS调试器中监视映射条目
- Confusion: decltype vs std::function
- 将IBM Rhapsody模型集成到VS 2019中
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- 使用VS Code和CMake Tools运行自定义命令
- 修改 VS Code 中的默认C++代码段
- 如何使用c++在VS 2019上运行SQL查询
- vs 2015 constexpr变量不恒定,但与2019相比还好吗
- 完美前进使用 std::forward vs RefRefCast
- 从VS 2015更新3更新到VS2015更新3 d后浮点计算行为不同的原因
- VS 2015 链接错误 无法构建依赖于 libcurl 的项目
- consteval wrapper vs. source_location
- VS Code C++:不准确的系统包括路径错误(wchar.h,boost/lambda/lambda.hpp)
- QStringList vs list<shared_ptr<QString>> 性能比较C++
- 创建进程lpApplicationName vs lpCommandLine