【问题标题】:Way to differentiate between cmd line args and drag-onto-icon args in Windows?在Windows中区分cmd line args和drag-onto-icon args的方法?
【发布时间】:2011-09-08 08:05:30
【问题描述】:

我有一个用 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 上。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢。如果仅检测到一个参数(文件名 arg),我更改了代码以询问其他选项。因此,如果您仅在命令行上传递文件名,您会得到与将文件拖到应用程序图标上时出现的相同的框。现在似乎可以正常工作而不会崩溃。
    【解决方案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
    }
    

    【讨论】:

      【解决方案3】:

      我认为你不能,当你将文件拖到图标上时,操作系统会使用文件名作为命令行中的参数来执行程序,因此它们实际上是相同的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-12
        • 2013-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-03
        相关资源
        最近更新 更多