什么可以将Windows命令行参数解析为args[]?

4
在Windows上,CreateProcess win32函数用于创建新进程。该函数的签名接受指向“命令行”lpCommandLine的指针,因此将命令行作为单个字符串传递。
我熟悉的每种语言(C、C++、C#、Java)都允许一个接受字符串数组的main函数。因此,在CreateProcess和main之间必须有某个解析lpCommandLine并将其转换为args[]的东西。
这个解析代码在哪里?它是操作系统的一部分(在CreateProcess内部),还是每种语言的“运行时”(在调用main之前在新进程内运行的代码)的一部分?

1
规则似乎在这里:https://learn.microsoft.com/en-us/previous-versions/17w5ykft(v=vs.85) - Shawn
2
@MarkPflug,操作系统必须至少解析命令行,以确定在lpApplicationName参数为空的情况下运行哪个命令(允许的情况)。当然,考虑到微软编写了很多自己的语言运行时,并且它以混合层而闻名,我不确定该问题是否实际上在询问有意义的区别。 - John Bollinger
3
这取决于所调用的应用程序。CreateProcess会转发命令行;进程入口点最终负责区分参数。例如,WinMainCRTStartup和wWinMainCRTStartup是MSVS构建的C或C++应用程序的默认入口点,分别用于窄字符或Unicode字符编码。两者都能够将cmd行参数从CreateProcess参数中拆分出来。 - WhozCraig
1
这取决于应用程序以及它所编写的语言。CreateProcess和操作系统的角色不是“解析lpCommandLine并将其转换为args[]”。了解更多信息请点击链接:https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessa - user585968
@JohnBollinger 我认为这个区别非常有意义。如果参数由操作系统解析,那么行为应该是一致的,无论使用哪种语言。如果解析是由语言运行时本身完成的,那么行为可能会因语言甚至语言版本的实现方式而异。 - MarkPflug
1个回答

3

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

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

回想当年我作为 Windows C 程序员时,C 运行时源代码包含在 SDK 中。


1
如果我们不使用 lpApplicationName 来传递显式的可执行文件路径,CreateProcessW 将解析命令行以查找可执行文件,并对空格和双引号进行特殊处理。如果没有引号,则它会消耗空格直到找到可执行文件为止。例如,它可能会找到 C:\Program Files\spam\eggs.exe,但如果存在 C:\program.exe 则不会找到。 - Eryk Sun
如果应用程序的运行时库不解析命令行,则可以使用Unicode命令行手动调用CommandLineToArgvW,该函数是Windows shell,shell32.dll的一部分,可从GetCommandLineW获取。 - Eryk Sun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接