【问题标题】:What parses command line args into args[] on Windows?什么在 Windows 上将命令行 args 解析为 args[]?
【发布时间】:2020-01-19 22:29:15
【问题描述】:

在 Windows 上,CreateProcesswin32 函数用于创建新进程。此函数的签名采用指向“命令行”lpCommandLine 的指针,因此命令行作为单个字符串传递。

我熟悉的每种语言(C、C++、C#、Java)都允许有一个接受字符串数组的main 函数。所以,在 CreateProcess 和 main 之间的某个地方,一定有一些东西正在解析 lpCommandLine 并将其转换为 args[]

这个解析代码在哪里?它是操作系统的一部分(在CreateProcess 内),还是每种语言“运行时”的一部分(在调用main 之前在新进程内运行的代码)?

【问题讨论】:

  • @MarkPflug,操作系统必须解析命令行至少足以确定在lpApplicationName 参数为空的(允许的)情况下运行什么命令。当然,鉴于微软编写了很多自己的语言运行时,而且它以混合层而臭名昭著,我不确定这个问题实际上是在询问有意义的区别。
  • 这在很大程度上取决于被调用的应用程序。 CreateProcess 转发命令行;进程入口点本身最终负责识别参数分解。例如:WinMainCRTStartup 和 wWinMainCRTStartup 是 MSVS 构建的 C 或 C++ 应用程序的默认入口点,分别构建为窄或 unicode。两者都能够将命令行参数与 CreateProcess 参数分开。
  • 这取决于应用程序及其编写的任何语言。"[parse] lpCommandLine 并将其转换为 args[] 不是 CreateProcess 或操作系统的角色。" Tell me more
  • @JohnBollinger 实际上,我认为这种区别非常有意义。如果 args 由操作系统解析,那么无论使用何种语言,行为都应该是一致的。如果解析是由语言运行时本身完成的,那么行为可能会有所不同,具体取决于语言,甚至是语言的 version 碰巧实现它的方式。

标签: java c# c windows command-line-arguments


【解决方案1】:

链接到您正在运行的程序的运行时启动代码。例如,对于 C,它是 crt0.c。

创建的进程在用户模式下在某个声明的入口点开始执行,该入口点不是main。调用main的是C运行时。

当我还是一名 Windows C 程序员时,SDK 中包含了 C 运行时源代码。

【讨论】:

  • 如果我们不使用lpApplicationName 传递明确的可执行文件路径,CreateProcessW 会解析可执行文件的命令行,并对空格和双引号进行特殊处理。如果没有引用,它会消耗空格,直到找到可执行文件。例如,它可能会找到C:\Program Files\spam\eggs.exe,但如果C:\program.exe 存在则不会。
  • 如果选择的应用程序运行时库不解析命令行,它可以使用来自GetCommandLineW 的Unicode 命令行手动调用CommandLineToArgvW。此函数是 Windows shell shell32.dll 的一部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 2015-04-11
  • 1970-01-01
  • 1970-01-01
  • 2013-12-31
  • 2018-06-18
  • 1970-01-01
相关资源
最近更新 更多