2011-06-04 59 views
2

我有一个使用C(MinGW)编写的Windows GUI应用程序,并希望应用程序执行不同的任务,具体取决于它是通过命令行使用文件名参数启动还是通过将文件拖动到应用程序图标上来执行。现在是这样的,下面的函数不区分这两种:在Windows中区分cmd行参数和拖动图标参数的方法?

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

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

我想让用户能够将文件拖动到应用程序图标上,然后出现一个窗口,询问所需的选项。如果用户使用已提供的必需选项通过命令行启动应用程序,则应用程序将立即开始处理而不要求额外输入。这可能吗?

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

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

为什么要通过拖放正下降时,启动这只是发生的呢?我在Windows 7 x64上。

回答

2

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

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

+0

谢谢。如果只检测到一个参数(文件名为arg),我将代码更改为要求其他选项。所以,如果您只在命令行上传递文件名,那么如果您将文件拖放到应用程序图标上,则会出现相同的框。似乎现在工作正常,没有崩溃。 – Synthetix 2011-06-04 11:02:55

1

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

2

这当然有可能。假设用户必须在命令行上指定-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 
}