Win32 API命令行参数解析

时间:2012-10-02 11:07:37

标签: c windows winapi command-line command-line-arguments

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

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

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

9 个答案:

答案 0 :(得分:13)

答案 1 :(得分:7)

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

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

答案 2 :(得分:3)

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

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,而另一个人已经评论过。

答案 3 :(得分:2)

只是为了记录,如果您使用MinGW's GCC而不是Microsoft的MSVC,您将获得GNU getopt(其中还包括getopt_long和getopt_long_only变体),包含在标准运行时库中。

答案 4 :(得分:2)

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

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

答案 5 :(得分:2)

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

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

答案 6 :(得分:1)

如果您的需求很简单,您可能需要查看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不关心:

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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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