繁体   English   中英

Win32 API命令行参数解析

[英]Win32 API command line arguments parsing

我正在编写Win32控制台应用程序,它可以使用这样的可选参数启动:

app.exe /argName1:"argValue" /argName2:"argValue"

我是否必须手动解析它(以便能够确定哪些参数存在)来自argc / argv变量,或者Win32 API是否包含一些参数解析器?

Win32为命令行参数提供的唯一支持是函数GetCommandLineCommandLineToArgvW 这与控制台应用程序的argv参数完全相同。

您将不得不自己进行解析。 正则表达式将是一个很好的选择。

你可以搞乱各种库和东西......但有时候你需要的只是简单,实用和快速:

int i;
char *key, *value;

for( i = 1; i <= argc; i++ ) {
    if( *argv[i] == '/' ) {
        key = argv[i] + 1;
        value = strchr(key, ':');
        if( value != NULL ) *value++ = 0;
        process_option( key, value );
    } else {
        process_value( argv[i] );
    }
}

你明白了......

这是假设一个正常的Win32控制台应用程序,因为你暗示(具有传统的main功能)。 对于Win32应用程序,您来自WinMain ,而另一个人已经评论过。

只是为了记录,如果你使用MinGW的GCC ,而不是微软的MSVC,你会得到GNU getopt(包括getopt_long和getopt_long_only变体),包含在标准运行时库中。

您可以通过在循环中使用GetCommandLine, PathRemoveArgs, PathGetArgs来解析参数

https://msdn.microsoft.com/en-us/library/windows/desktop/bb773742(v=vs.85).aspx

我一直在开发和使用用简单C编写的libparamset 。它非常强大,在Windows上运行良好。 它提供:

  • 是跨平台的。
  • 通配符支持Windows上的文件输入!
  • 强大的功能。 请参阅libparamset

如果您的需求很简单,您可能想看看Argh!
它是单头,超级好用:

int main(int, char* argv[])
{
    argh::parser cmdl(argv);          // declare

    if (cmdl[{ "-v", "--verbose" }])  // use immediately
        std::cout << "Verbose, I am.\n";

    return EXIT_SUCCESS;
}

通过不引人注目,它不会接管你的main()函数。

从自述文件:

哲学

与许多替代方案相反, argh采用极简主义的自由放任方式,非常适合采用以下规则进行简单的原型设计:

API是:

  • 简约但富有表现力:
    • 没有吸气剂或粘合剂
    • 只是[]()运算符。
    • 简单迭代(增程for过)。
  • 你不支付你不使用的东西;
  • 在解析阶段之后 ,在用户端转换为类型变量(通过std::istream >> );
  • 没有为失败抛出异常。
  • 自由BSD许可证;
  • 单头文件;
  • 没有非std依赖项。

argh不关心:

  • 你的选择之前有多少' - ';
  • 您支持哪些标志和选项 - 这是您的责任;
  • 语法验证: 任何命令行都是位置参数标志选项的有效( 不一定是唯一的 )组合;
  • 自动生成使用消息。

我不相信有可用的Win32 API。 您可以查找getopt或其他库的Windows实现。

不确定是否存在这样的win32 api函数,但是Boost.Program_Options库可以帮到你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM