Бррр ничего не понял. Что ты хочешь? Смотри у тебя есть объект CCommandLineInfo, в который встроена определённая логика работы с определёнными параметрами 
Параметры перебираются здесь - всё довольно просто
void CWinApp::ParseCommandLine(CCommandLineInfo& rCmdInfo)
{
	for (int i = 1; i < __argc; i++)
	{
		LPCTSTR pszParam = __targv[i];
		BOOL bFlag = FALSE;
		BOOL bLast = ((i + 1) == __argc);
		if (pszParam[0] == '-' || pszParam[0] == '/')
		{
			// remove flag specifier
			bFlag = TRUE;
			++pszParam;
		}
		rCmdInfo.ParseParam(pszParam, bFlag, bLast);
	}
}
Обработка каждого параметра, который является флажком (признак -) происходит здесь
void CCommandLineInfo::ParseParamFlag(const char* pszParam)
{
	// OLE command switches are case insensitive, while
	// shell command switches are case sensitive
	if (lstrcmpA(pszParam, "pt") == 0)
		m_nShellCommand = FilePrintTo;
	else if (lstrcmpA(pszParam, "p") == 0)
		m_nShellCommand = FilePrint;
	else if (lstrcmpiA(pszParam, "Register") == 0 ||
			 lstrcmpiA(pszParam, "Regserver") == 0)
		m_nShellCommand = AppRegister;
	else if (lstrcmpiA(pszParam, "Unregister") == 0 ||
			 lstrcmpiA(pszParam, "Unregserver") == 0)
		m_nShellCommand = AppUnregister;
	else if (lstrcmpA(pszParam, "dde") == 0)
	{
		AfxOleSetUserCtrl(FALSE);
		m_nShellCommand = FileDDE;
	}
	else if (lstrcmpiA(pszParam, "Embedding") == 0)
	{
		AfxOleSetUserCtrl(FALSE);
		m_bRunEmbedded = TRUE;
		m_bShowSplash = FALSE;
	}
	else if (lstrcmpiA(pszParam, "Automation") == 0)
	{
		AfxOleSetUserCtrl(FALSE);
		m_bRunAutomated = TRUE;
		m_bShowSplash = FALSE;
	}
}
Если твои параметры не попадают в этот список, то они просто игнорируются объектом CCommandLineInfo. Ну в самом деле, откуда ему знать, что ты (или я, или ещё кто другой) захотят передать. Он отвечает только за уже встроеные в МFC механизмы.
Например - означает флажок, -а - нет такого флажка - игнорируем. 
След. параметр без -. Значит обрабатываем 
void CCommandLineInfo::ParseParamNotFlag(const TCHAR* pszParam)
{
	if (m_strFileName.IsEmpty())
		m_strFileName = pszParam;
	else if (m_nShellCommand == FilePrintTo && m_strPrinterName.IsEmpty())
		m_strPrinterName = pszParam;
	else if (m_nShellCommand == FilePrintTo && m_strDriverName.IsEmpty())
		m_strDriverName = pszParam;
	else if (m_nShellCommand == FilePrintTo && m_strPortName.IsEmpty())
		m_strPortName = pszParam;
}
Отсюда m_strFileName = test
Дальше опять флажок -b - нет такого, игнорируем. Ну и последний параметр тоже не попадает ни в один из обработчиков. Значит тоже игнорируем.
Всё.
Так чего же ты хочешь/ждёшь? Что ты ожидаешь увидеть в m_strFileName? Один раз зайди дебуггером в ф-ю ParseCommandLine затрать одну минуту и всё станет ясно. 

А я тебе сразу посоветовал, сделать свой класс CMyCommandLineInfo : public CCommandLineInfo и перепиши в нём две ф-ции - для флажковых параметров и для обычных. И всего делов
void CMyCommandLineInfo::ParseParamNotFlag(const TCHAR* pszParam)
{
	CString stParam(pszParam);
	if(stParam.CompareNoCase(_T("test"))==0)
	{
	}
	else if(stParam.CompareNoCase(_T("mjau"))==0)
	{
	}
}
void CMyCommandLineInfo::ParseParamFlag(const char* pszParam)
{
	CString stParam(pszParam);
	if(stParam.CompareNoCase(_T("a"))==0)
	{
	}
	else if(stParam.CompareNoCase(_T("b"))==0)
	{
	}
}
Делов на 1,5 минуты. 
