在Windows中区分cmd行参数和拖动图标参数的方法?

我有用C(MinGW)编写的Windows GUI应用程序,并希望应用程序执行不同的任务,具体取决于它是通过命令行使用文件名参数启动还是通过将文件拖到应用程序图标上。 现在的方式,以下function不区分两者:

int argc; LPWSTR *argv = CommandLineToArgvW(GetCommandLineW(),&argc); 

当一个文件被拖到应用程序的图标上时,它假定它是通过命令行启动的。 这个问题是我需要额外的参数,必须通过命令行传递,以做任何有用的事情。 文件名本身是不够的,所以应用程序退出,因为它没有足够的信息进行。

我想要的是用户能够将文件拖到应用程序图标上,并有一个窗口来要求所需的选项。 如果用户通过命令行启动了应用程序,并且已经提供了必要的选项,那么应用程序将立即开始处理而不要求额外的input。 这可能吗?

我遇到的另一个问题是,有时当一个文件被拖到应用程序的图标,它崩溃。 我把它缩小到任何对argv []值进行操作的东西。 如果通过具有相同参数的命令行启动,则不这样做。 例如,这会使应用程序崩溃20%:

 fprintf(stderr,"argv[3] was %ls\n",(LPWSTR)argv[3]); 

为什么只有通过拖放才能启动? 我在Windows 7 x64上。

Windows将默认调用您的程序与您放在其图标上的文件的文件名作为第一个也是唯一的参数。 因此,在这种情况下,当有人从命令行启动程序时,您将得到完全相同的调用参数,并且只有唯一的参数具有相同文件的全限定名。

但是,你可以添加额外的参数到一个快捷方式图标,当你安装你的应用程序,即"path\myapp.exe -gui" 。 这样可以区分通过图标进行的调用(也适用于不带任何参数的双击)以及通常不会指定-gui参数的命令行上的调用。

这当然是可能的。 假设用户必须在命令行上指定-slow-fast 。 你的代码看起来像这样:

 int main( int argc, char *argv[] ) { if ( argv contains "-slow" or -"fast" ) { we were launched fronm the command line else we were either launched from an icon, or the user has not specified -slow or -fast. In either case, pop up a dialog to get the options endif } 

我不认为你可以,当你通过一个图标拖动文件时,操作系统在命令行中使用文件名作为参数执行程序,所以它们实际上是相同的。