概览
CCommandLineInfo用于分析启动应用时的命令行参数。所需头文件
#include <afxwin.h>
运行原理
MFC应用会在它的应用对象中使用函数InitInstance创建此
类的本地实例,然
后把该对象传给CWinApp::ParseCommandLine,ParseCommandLine又重复调用ParseParam填充CCommandLineInfo对象,
最后,CCommandLineInfo对象被传给CWinApp::ProcessShellCommand来处理命令行参数和选项。
类成员
app
建立新文件
app 文件名 打开文件
app /p 文件名 在缺省打印机上打印文件
app /pt 文件名 打印机 驱动程序 打印端口 在指定的打印机上打印文件
app /dde 启动程序并等待DDE命令
app /Automation 启动为一个OLE自动服务器
app /Embedding 启动来编辑嵌入的OLE项
app 文件名 打开文件
app /p 文件名 在缺省打印机上打印文件
app /pt 文件名 打印机 驱动程序 打印端口 在指定的打印机上打印文件
app /dde 启动程序并等待DDE命令
app /Automation 启动为一个OLE自动服务器
app /Embedding 启动来编辑嵌入的OLE项
类定义源码分析
class CCommandLineInfo : public CObject
{
public:
// Sets default values
CCommandLineInfo();
//plain char* version on UNICODE for source-code backwards compatibility
virtual void ParseParam(const TCHAR* pszParam, BOOL bFlag, BOOL bLast);
#ifdef _UNICODE
virtual void ParseParam(const char* pszParam, BOOL bFlag, BOOL bLast);
#endif
BOOL m_bShowSplash;
BOOL m_bRunEmbedded;
BOOL m_bRunAutomated;
enum { FileNew, FileOpen, FilePrint, FilePrintTo, FileDDE,
AppUnregister, FileNothing = -1 } m_nShellCommand;
// not valid for FileNew
CString m_strFileName;
// valid only for FilePrintTo
CString m_strPrinterName;
CString m_strDriverName;
CString m_strPortName;
~CCommandLineInfo();
// Implementation
protected:
void ParseParamFlag(const char* pszParam);
void ParseParamNotFlag(const TCHAR* pszParam);
#ifdef _UNICODE
void ParseParamNotFlag(const char* pszParam);
#endif
void ParseLast(BOOL bLast);
};
由上述定义可以看出,分析结果分几类:是否OLE激活;应该执行什么动作(FileNew、FileOpen等);传递的参数(打开或打印的文件名,打印设备、端口等)。
当命令行空时,执行FileNew命令。原因在于CCommandLineInfo的缺省构造函数:
CCommandLineInfo::CCommandLineInfo()
{
m_bShowSplash = TRUE;
m_bRunEmbedded = FALSE;
m_bRunAutomated = FALSE;
m_nShellCommand = FileNew;//指定了SHELL命令操作
}
缺省构造把应该执行的动作指定为FileNew。
其次,分析 CWinApp::ProcessShellCommand(CCommandLineInfo& rCmdInfo)的流程,命令类型是FILENEW时,调用的函数就是标准命令ID_FILE_NEW对应的处理函数OnFileNew;命令类型是FILEOPEN时调用的函数是OpenDocumentFile,标准命令ID_FILE_OPEN的处理函数OnFileOpen的工作实际上就是由OpenDocumentFile完成的。函数FileNew、OpenDocumentFile导致了窗口、文档的创建。