PrintLine(strHelpTitle); //Print out the help informationline by line.
PrintLine(strHelpVer);
PrintLine(strHelpMem);
PrintLine(strHelpSysInfo);
PrintLine(strSysName);
PrintLine(strHelpHelp);
PrintLine(strSupport);
PrintLine(strTime);
PrintLine(strRunTime);
PrintLine(strIoCtrlApp);
PrintLine(strSysDiagApp);
PrintLine(strFsApp);
PrintLine(strNetApp);
PrintLine(strFdiskApp);
PrintLine(strLoadappApp);
PrintLine(strGUIApp);
#ifdef __CFG_APP_JVM
PrintLine(strJvmApp);
#endif //__CFG_APP_JVM
PrintLine(strReboot);
PrintLine(strCls);
return S_OK;
}
需要注意的是,不仅仅要增加一个LPSTR(char*)类型的字符串定义,还要在下面增加对应的PrintLine输出,否则不会有信息书出来。
完成上述三个步骤之后,重新编译HelloX内核,然后用最新的内核引导计算机。进入shell后,执行help命令,应该可以看到新增加的外部命令了。输入对应的外部命令字符串,即可看到外部命令的执行结果。
实际上,外部命令的复杂之处,主要还是在于如何处理用户输入,以及如何根据用户的输入,调用对应的子命令处理函数。HelloX实现了很多外部命令,比如本文讲到的network命令,系统诊断sysdiag命令,输入输出控制ioctrl命令,以及文件系统操作命令fs等。开发者可以在这些外部实现的基础上,利用已有的框架,修改特定的部分即可。比如,对于外部命令的入口函数,可以直接在现有的基础上,修改一下函数名。对于子命令处理函数,可以根据需要,进行修改或定义。完成后,要增加到本地子命令映射数组中。比如network命令的子命令映射数组如下:
static struct __NETWORK_CMD_MAP{
LPSTR lpszCommand;
DWORD (*CommandHandler)(__CMD_PARA_OBJ*);
LPSTR lpszHelpInfo;
}SysDiagCmdMap[] = {
{"iflist", iflist, " iflist : Show all network interface(s) insystem."},
{"ping", ping, " ping : Check a specifiedhost's reachbility."},
{"route", route, " route : List all route entry(ies) insystem."},
{"exit", _exit, " exit : Exit theapplication."},
{"help", help, " help : Print out thisscreen."},
{"showint", showint, " showint : Display ethernet interface's statisticsinformation."},
{"assoc", assoc, " assoc : Associate to a specified WiFiSSID."},
{"scan", scan, " scan : Scan WiFi networks andshow result."},
{"setif", setif, " setif : Set IP configurations to a giveninterface."},
{NULL, NULL, NULL}
};
数组元素的第一个参数,就是子命令字符串,第二个参数,是该子命令的处理函数。最后一个字符串信息,则是该子命令的帮助信息。在外部命令提示符下,输入help,就会显示出所有可用的子命令帮助信息。
开发者可以在此基础上,根据自己的实现,修改或删除特定的映射表项即可。
需要注意的是,为了确保整体代码的整洁,建议外部命令的组织,遵循下列原则:
1. 所有新增外部命令的代码,放在一个新创建的代码文件中,不要与现有的shell源文件放在一起;
2. 新增加的外部命令源文件,放在shell目录下。