有些时候我们需要我们的可执行程序在启动时获得用户指定的参数值,比如windows中常用的ping命令:

ping 192.168.0.1 –t

  其中192.168.0.1 和-t都是该可执行程序ping的参数。MFC中提供了比较便捷的方式来实现参数值的传入,也就是本文要讲述的CCommandLineInfo类。
通过MFC向导生成的应用程序框架,在主App类中可以看到如下的代码:

// 分析标准外壳命令、DDE、打开文件操作的命令行
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);

  这两行就是CCommandLineInfo类的标准用法,实现了新建、打开文件、打印机等的操作,具体用法参见:http://baike.baidu.com/view/2880057.htm?fr=ala0_1。如果需要定义自己的参数,则需要从CCommandLineInfo派生一个类,然后重载该类的ParseParam方法,实现参数的解析即可。

1.从CCommandLineInfo派生出类CMyCommandLineInfo:

class CMyCommandLineInfo : public CCommandLineInfo
{
public:
        void ParseParam(LPCTSTR lpszParam, BOOL bFlag, BOOL bLast);
};


2.在主程序App类中声明成员变量,用于保存命令行传入的参数:

CString m_strUsername;    
CString m_strPassword;    

     
3.重载ParseParam方法:

        void CMyCommandLineInfo::ParseParam(LPCTSTR lpszParam, BOOL bFlag, BOOL bLast)
        {
                static int num = 0;    
                CCommandLineInfo::ParseParam(lpszParam, bFlag, bLast);
                switch(num)
                {    
                        case 0:
                                theApp.m_strUsername = CString(lpszParam);
                                break;
                        case 1:
                                theApp.m_strPassword = CString(lpszParam);
                                break;
                }
                num++;
        }


  该方法通过递归的方式解析命令行中传入的所有参数,依次保存到相应的变量中。

4.修改主程序的调用,用派生的CCommandLineInfo类替换默认的:

CMyCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);


  通过这简单的几步,就可以方便的取得命令行参数了。要注意的是命令行在传递参数的顺序要同程序里定义的一致。如本例中,第1个参数是用户名,第2个参数是密码,如果顺序错了,程序自然不能得到正确的参数数据。