QStringList QCoreApplication :: arguments() - 在什么情况下索引0而不是Windows中的应用程序路径?

时间:2010-07-22 00:09:23

标签: windows qt

QStringList QCoreApplication::arguments()(Qt)的文档指出:

  

通常 arguments()。at(0)是   程序名,arguments()。at(1)是   第一个参数和arguments()。last()   是最后一个论点。 请参阅说明   以下是关于Windows。

进一步阐述:

  

在Windows上,[...] arguments()是   从...的返回值构造   GetCommandLine()。结果,    arguments()。at(0)给出的字符串   可能不是程序名称   Windows,取决于如何   申请已经开始。

参考最后一个粗体部分,我很好奇这适用于哪种情况.Qt文档没有解释它,也没有GetCommandLine的(WINAPI)文档。

1 个答案:

答案 0 :(得分:4)

当您的程序通过CreateProcess生成时,可能会发生这种情况 - 请查看 lpCommandLine 参数的说明。基本上,由调用CreateProcess的程序来填充第一个参数,因此可能会发生该值未按常规方式填充的情况。

从链接:

“如果lpApplicationName和lpCommandLine都是非NULL,则lpApplicationName指向的以null结尾的字符串指定要执行的模块,lpCommandLine指向的以null结尾的字符串指定命令行。新进程可以使用GetCommandLine用C语言编写的控制台进程可以使用argc和argv参数来解析命令行。因为argv [0]是模块名称,C程序员通常会重复模块名称作为命令行中的第一个标记来检索整个命令行。 。“

同样,如果您的程序是使用spawn系列函数从另一个程序启动的,则会发生这种情况。在那里,文档说明:

“必须将至少一个参数arg0或argv [0]传递给子进程。按照惯例,此参数是pathname参数的副本。但是,不同的值不会产生错误。”