在Windows中区分cmd line args和drag-to-icon args的方法?

时间:2011-06-04 10:36:10

标签: c windows visual-studio visual-studio-2008 mingw

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

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

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

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

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

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

为什么只有在通过拖放功能启动时才会发生这种情况?我在Windows 7 x64上。

3 个答案:

答案 0 :(得分:2)

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

但是,您可以在安装应用程序时向快捷方式图标添加其他参数,即"path\myapp.exe -gui"。这允许您通过一般的图标区分调用(也适用于不带任何参数的双击)和命令行上通常不会指定-gui参数的调用。

答案 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
}

答案 2 :(得分:1)

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