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函数的方法.但是命令行参数的方法确实在多数系统上是被使用的,因此,为了让你开发的程序适用于各种[平台,你还是应该提供命令行参数的支持.