【问题标题】:MFC - extend app to run from command lineMFC - 扩展应用程序以从命令行运行
【发布时间】:2011-05-10 08:41:19
【问题描述】:

我有一个现有的 MFC 应用程序,我正在尝试扩展它以接受命令行参数并在无人值守的情况下运行。

我需要在 InitInstance() 完成并且现有的 GUI 已完全加载之后 开始一些事件。我查看了 winmain.cpp,但我不清楚如何运行我的事件,因为它似乎启动了一个线程并从调试器中“消失”(即接下来执行什么?一定是 MFC 循环,对吧?是否有可能与那里挂钩?)我是新手,完全有可能我错过了更高层次的洞察力,这不是那么容易用谷歌搜索的。感谢指点。

谢谢。

【问题讨论】:

    标签: c++ command-line mfc


    【解决方案1】:

    你可以重载 PreTranslateMessage 而不是在那里跳过消息

    【讨论】:

      【解决方案2】:

      我会像往常一样解析InitInstance 中的命令行,但不是立即处理您找到的所有命令,而是为您关心的命令添加一些特殊处理(例如)将消息发回您自己的消息排队,因此当您准备好开始处理消息时,它们会显示为首先要做的事情。

      为此,我可能CComandLineInfo 派生一个类,并覆盖 ParseParam 以处理您关心的命令(并让它发送它不发送的任何其他参数识别回CComandLineInfo::ParseParam 正常处理)。然后,在 InitInstance 中,替换这段代码:

      // Parse command line for standard shell commands, DDE, file open
      CCommandLineInfo cmdInfo;
      ParseCommandLine(cmdInfo);
      

      使用您的自定义命令行解析器:

      MyCommandLineInfo cmdInfo;
      ParseCommandLine(cmdInfo);
      

      ParseCommandLine 将为命令行上的每个参数调用您的ParseParam,让您第一次有机会决定它的含义以及如何处理它。您可能需要查找 CComandLineInfo 已经理解的“标准”命令,除非您真的需要更改它们,否则不要管它们。

      【讨论】:

        【解决方案3】:

        拦截命令行参数的最简单方法是引用全局变量__targv(定义为LPCTSTR* __targv或类似的东西)和__argc(定义为int)。

        例如:

        for(int i = 0; i < __argc; ++i) {
            DoSomethingWithArg(__targv[i]);
        }
        

        基本上就像任何其他控制台应用程序一样。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-06-17
          • 1970-01-01
          • 2016-06-18
          • 1970-01-01
          • 1970-01-01
          • 2019-06-21
          • 1970-01-01
          相关资源
          最近更新 更多