Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Windows上,是什么将命令行参数解析为参数[]?_Java_C#_C_Windows_Command Line Arguments - Fatal编程技术网

Java 在Windows上,是什么将命令行参数解析为参数[]?

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之前在新进程

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

<> P> >我熟悉的每种语言(C++、C++、java)允许接受一个字符串数组的>主< /COD>函数。因此,在CreateProcess和
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的一部分。