【发布时间】: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