Java 在Windows上,是什么将命令行参数解析为参数[]?
在Windows上,win32函数用于创建新进程。此函数的签名采用指向“命令行”Java 在Windows上,是什么将命令行参数解析为参数[]?,java,c#,c,windows,command-line-arguments,Java,C#,C,Windows,Command Line Arguments,在Windows上,win32函数用于创建新进程。此函数的签名采用指向“命令行”lpCommandLine,因此命令行作为单个字符串传递 P> >我熟悉的每种语言(C++、C++、java)允许接受一个字符串数组的>主< /COD>函数。因此,在CreateProcess和main之间的某个地方,一定有某种东西正在解析lpCommandLine并将其转换为args[] 这个解析代码在哪里?它是操作系统的一部分(在CreateProcess内部),还是每种语言“运行时”(调用main之前在新进程
lpCommandLine
,因此命令行作为单个字符串传递
<> P> >我熟悉的每种语言(C++、C++、java)允许接受一个字符串数组的main
之间的某个地方,一定有某种东西正在解析lpCommandLine
并将其转换为args[]
这个解析代码在哪里?它是操作系统的一部分(在
CreateProcess
内部),还是每种语言“运行时”(调用main
之前在新进程内部运行的代码)的一部分?链接到正在运行的程序的运行时启动代码。例如,对于C,它是crt0.C
创建的进程在某个声明的入口点开始以用户模式执行,该入口点不是main
。调用main
的是C运行时
当我还是一名Windows C程序员时,SDK中包含了C运行时源代码。规则如下:@MarkPflug,操作系统必须对命令行进行足够的分析,以确定在
lpApplicationName
参数为null的情况下(允许)运行哪个命令。当然,考虑到微软编写了大量自己的语言运行时,而且它以混合层而臭名昭著,我不确定这个问题实际上是在询问一个有意义的区别。这在很大程度上取决于被调用的应用程序。CreateProcess转发命令行;流程入口点本身实际上负责识别参数分解。EX:WinMainCRTStartup和WWMNCRCRT启动是MCSS构建的C或C++应用程序的默认入口点,它们分别被构建为SIMULL或Unicode。两者都能够将cmd行参数与CreateProcess参数分开。这取决于应用程序和它所用的任何语言。“解析lpCommandLine并将其转换为args[]”既不是CreateProcess的角色,也不是OS的角色@约翰伯林格我认为这种区别实际上是很有意义的。如果操作系统解析参数,那么无论使用何种语言,行为都应该是一致的。如果解析是由语言运行库本身完成的,那么行为可能会有所不同,这取决于语言,甚至是语言版本如何实现它。如果我们不使用lpApplicationName
传递显式的可执行路径,CreateProcessW
解析可执行文件的命令行,对空格和双引号进行特殊处理。如果没有引用,则会占用空格,直到找到可执行文件为止。例如,它可能会找到C:\Program Files\spam\eggs.exe
,但如果C:\Program.exe
存在,则不会找到。如果应用程序的运行库选择不解析命令行,则可以从中使用Unicode命令行手动调用。此函数是Windows shell shell32.dll的一部分。