CreateProcess - lpApplicationName 与 lpCommandLine

发布于 2024-11-02 02:55:11 字数 608 浏览 1 评论 0原文

我一直在使用 CreateProcess Win API,我想知道使用 lpApplicationName 和 lpCommandLine 作为参数与仅使用 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。只是为了便于理解。

非常感谢您的帮助!

安迪

I've been using the CreateProcess Win API, and I was wondering what the difference was between using the lpApplicationName and lpCommandLine for arguments v.s. just the lpCommandLine parameter.

For example:

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

I assume that the second option, where only lpCommandLine is used would be like opening up cmd.exe and running that exact line. But what about the first line, is it loading up the application and specifying the command line arguments differently?

I've had a look at the MSDN documentation for the API but it doesn't seem to really detail whats happening, that what that parameters can contain, which is fine, but I'm just confused about what I should be doing when there are multiple ways to do it.

Please note, I know the two sample lines may not work as lpCommandLine requires a LPTSTR, not LPCTSTR. Its just for ease of understanding.

Thanks a lot for any help!

Andy

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

醉南桥 2024-11-09 02:55:12

推荐的方法是使用这两个参数。如果您不指定 lpApplicationName,您将让 Windows 解析 lpCommandLine 来找出应用程序名称。由于空格是文件名和目录名中的有效字符,因此这可能(在极少数情况下)导致运行错误的应用程序。 (例如,如果您有 c:\program.exe 并且在 Windows XP 中的 c:\program files 下启动程序)。

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

The recommended way is to to use both parameters. If you do not specify lpApplicationName you let Windows parse lpCommandLine to figure out the application name. Because space is a valid character in file names and directory names, this can (in rare cases) lead to wrong application being run. (e.g. if you have c:\program.exe and you start a program under c:\program files in Windows XP).

In both cases you should use the application name in lpCommandLine since this is used to calculate Argv[0].

青柠芒果 2024-11-09 02:55:12

我从不使用 lpApplicationName 并始终引用 lpCommandLine 的应用程序部分,在您的示例中我将执行 "C:\Path\To\Notepad.exe" "C:\Path\To\File\To\Load.txt" (引用传递给 CreateProcess 的所有路径是一个好主意)仅使用 lpApplicationName 可能会导致访问 argv[0] 的子进程出现问题,这就是我远离它的原因。


<咆哮>
在除您自己之外的其他任何地方使用 CreateProcess 都可能会出现问题,因为 NT6+ 可以在任何时候由于应用程序兼容性填充程序和/或安装程序检测而决定您正在执行的操作需要管理员权限,然后 CreateProcess 就会失败。除非您需要使用调试或脱离作业标志,否则我建议您仅调用 ShellExecute[Ex] 以确保安全......

I never use lpApplicationName and always quote the application part of lpCommandLine, in your example I would execute "C:\Path\To\Notepad.exe" "C:\Path\To\File\To\Load.txt" (Quoting all paths passed to CreateProcess is a good idea) Just using lpApplicationName can cause problems with child processes that access argv[0] which is why I stay away from it.


<rant>
Using CreateProcess on anything other than yourself can be problematic since NT6+ can at any point decide that the thing you are executing requires admin rights because of application compatibility shims and/or installer detection and then CreateProcess just fails. Unless you need to use the debug or break away from job flags, I would suggest just calling ShellExecute[Ex] to be on the safe side...</rant>

挖鼻大婶 2024-11-09 02:55:12

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

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

According to MSDN, lpApplicationName is optional and can be NULL. In that case, the module name must be the first white space–delimited token in the lpCommandLine string.

If the executable module is a 16-bit application, lpApplicationName should be NULL, and the string pointed to by lpCommandLine should specify the executable module as well as its arguments.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文