【问题标题】:How do I get the command line option for my Win32 C/C++ program?如何获得 Win32 C/C++ 程序的命令行选项?
【发布时间】:2021-07-30 17:24:50
【问题描述】:

我有一个 C/C++ winapi 程序,我想将命令行功能扩展到该程序(我在 C# 中看到过,但从未在 C++ 中看到过)。如果可执行文件在没有参数的情况下打开,它会正常打开窗口,但是当从带有参数(例如输入或输出文件)的命令行调用时,窗口不会打开,所有用户交互都是通过命令行完成的。我怎么能做到这一点?最好我希望能够在 C 中完成,因为那是我的 WinMain() 函数所在的地方。

提前感谢您的帮助!

【问题讨论】:

    标签: c++ c winapi


    【解决方案1】:

    WinMain 中有LPSTR lpCmdLine 参数。您可以使用CommandLineToArgvW 函数解析lpCmdLine。当必要的参数存在时,您将不会创建或显示程序窗口并执行此工作。

    【讨论】:

    • 刚刚查阅了文档。如何确定以pNumArgs 传递给CommandLineToArgvW 的命令行参数的数量?编辑:没关系,它是一个指向将分配参数数量的指针。非常感谢!
    • CommandLineToArgvW 是辅助函数。您可以使用循环直接分析lpCmdLine,尤其是在您只期望 1 个参数的情况下。 CommandLineToArgvW 很好解析,例如带引号的长文件名。
    • 注意:使用CommandLineToArgvW()时,最好使用GetCommandLineW()来保证Unicode字符串,而不是WinMain()lpCmdLine参数,它不是Unicode字符串。跨度>
    【解决方案2】:

    您可以通过多种方式将(解析的)命令行参数传递给您的应用程序。

    入口点

    CRT 将命令行作为第三个参数传递到用户提供的入口点 (WinMain)。取决于您的应用程序是否为 Unicode 编译,这是一个宽字符串或一个窄字符串。在接受您无法控制的输入时,不能保证使用窄字符版本。命令行正在接受您无法控制的输入,因此您必须针对 Unicode 进行编译(通过定义 UNICODE_UNICODE 预处理器符号)。

    无论哪种方式,命令行都作为单个字符串传递。因此,除非您解析出各个参数,否则它的效用有限。

    使用 Windows API

    Windows API 提供了GetCommandLineW 函数,允许您在程序中的任何位置获取指向命令行的指针。同样,这仅返回单个字符串。可以通过调用CommandLineToArgvW 将字符串解析为单独的参数,从而生成参数数组及其大小。请注意,CommandLineToArgvW 没有窄字符版本,因此如果您不针对 Unicode 进行编译,则不能将其应用于传递给 WinMain 的命令行参数。

    无论如何,即使您不针对 Unicode 进行编译,这两个 API 调用也是可用的。

    CRT

    如果您不关心可移植性,Microsoft 的 CRT 实现提供了__argc, __argv, __wargv 全局变量,可以在程序中的任何位置使用它来获取已解析的命令行。虽然方便,但它取决于定义的预处理器符号 __wargv 是否存储有效指针。只有在定义了_UNICODE 时才会这样做。

    【讨论】:

      猜你喜欢
      • 2012-06-06
      • 2011-08-02
      • 1970-01-01
      • 1970-01-01
      • 2015-05-28
      • 1970-01-01
      • 1970-01-01
      • 2013-09-04
      • 2015-02-07
      相关资源
      最近更新 更多