企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 20.5 解析命令行参数 允许程序在初始化的时候分析命令行参数是很有用的,对于一个文档视图架构的程序来说,你应该允许程序通过这样的方式打开文件.也可能你想让你的程序可以从命令行启动,以便进行一些自动化的工作,这时候你可以通过命令行参数告诉你的应用程序不要显示用户界面.虽然通常应用程序的大部分工作都是通过用户界面完成的,但是有时候命令行参数还是很有用的,比如用它来打开程序的调试开关. wxWidgets提供了wxCmdLineParser类用来简化这部分的编程工作,以避免你需要直接处理wxApp::argc和 wxApp::argv.这个可以处理开关类型参数(比如-verbose),选项类型参数(比如-debug:1)以及命令参数(比如 "myfile.txt")等.对于开关类型参数和选项类型参数,它允许你设置它们的长参数形式和短参数形式,你还可以给每个参数提供一个帮助字符串,这个字符串将在需要显示使用帮助的时候打印在当前的Log目标上. 下面的例子演示了怎样使用开关类型,选项类型等各种参数: ``` #include "wx/cmdline.h" static const wxCmdLineEntryDesc g_cmdLineDesc[] = { { wxCMD_LINE_SWITCH, wxT("h"), wxT("help"), wxT("displays help on the command line parameters") }, { wxCMD_LINE_SWITCH, wxT("v"), wxT("version"), wxT("print version") }, { wxCMD_LINE_OPTION, wxT("d"), wxT("debug"), wxT("specify a debug level") }, { wxCMD_LINE_PARAM, NULL, NULL, wxT("input file"), wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL }, { wxCMD_LINE_NONE } }; bool MyApp::OnInit() { // 分析命令行 wxString cmdFilename; wxCmdLineParser cmdParser(g_cmdLineDesc, argc, argv); int res; { wxLogNull log; // 传递False参数以便在分析命名行发生错误的时候不显示使用帮助对话框. res = cmdParser.Parse(false); } // 检查是否用户正在询问使用帮助 if (res == -1 || res > 0 || cmdParser.Found(wxT("h"))) { cmdParser.Usage(); return false; } // 检查是否用户正在询问版本号 if (cmdParser.Found(wxT("v"))) { #ifndef __WXMSW__ wxLog::SetActiveTarget(new wxLogStderr); #endif wxString msg; wxString date(wxString::FromAscii(__DATE__)); msg.Printf(wxT("Anthemion DialogBlocks, (c) Julian Smart, 2005 Version %.2f, %s"), wbVERSION_NUMBER, (const wxChar*) date); wxLogMessage(msg); return false; } // 检查是否用户希望以调试模式启动 long debugLevel = 0; if (cmdParser.Found(wxT("d"), & debugLevel)) { } // 检查是否用户传递了一个工程名 if (cmdParser.GetParamCount() > 0) { cmdFilename = cmdParser.GetParam(0); // 在windows系统上,如果通过资源管理器打开一个文件的时候, // 传递的是短格式的文件名 // 因此我们可以把它变成长格式文件名 wxFileName fName(cmdFilename); fName.Normalize(wxPATH_NORM_LONG|wxPATH_NORM_DOTS| wxPATH_NORM_TILDE|wxPATH_NORM_ABSOLUTE); cmdFilename = fName.GetFullPath(); } ... return true; } ``` 使用wxFileName对文件名进行正常化是必要的,因为有时候在以命令行方式启动程序的时候,windows会传递短格式的文件名. 正如我们在前面介绍的那样,在MacOSX上,当打开一个文档的时候不使用命令行参数,而使用直接调用wxApp:: MacOpenFile函数的方法.但是命令行参数的方法确实在多数系统上是被使用的,因此,为了让你开发的程序适用于各种[平台,你还是应该提供命令行参数的支持.