[MFC] Windowsアプリで引数を受け取る
GUIベース(Windowsフォームを提供)するアプリケーションを作成しているのだけど、ここにいてバッチ処理をしたいとかいう風に言われた。今まで苦労してGUIの機能を作ってきたのは何だったのだろう?
と、いうことでコマンドライン引数を受け取った場合にフォームを生成せずに処理できるように作り直すことになりましたとさ。
コマンドライン引数の受け取り
WindowsアプリケーションのInitInstance()の中に以下のコードを書けばいいらしい。
//VC2005, 文字コード: Unicode // コマンドライン引数を格納する配列 CStringArray cmdParams; { // コマンドライン引数の取得 CString cmdParam( m_lpCmdLine ); cmdParam.Trim(); // パラメータの取得 int curPos = 0; CString param = cmdParam.Tokenize( _T("/"), curPos ); while( param != "" ){ cmdParams.Add( param.Trim() ); param = cmdParam.Tokenize( _T("/"), curPos ); } }
上記の例だと example.exe /test1 /test2とコマンドライン引数を与えると
cmdParams[0]: test1
cmdParams[1]: test2
となる。
コマンドライン引数取得の改良
パラメータを半角スペースで区切る。ただし、"(ダブルクォーテーション)で括われていた場合、その中は半角スペースを含むことができるようにする。
// コマンドライン引数の取得 CString cmdParam( m_lpCmdLine ); cmdParam.Trim(); CStringArray cmdParams; // 引数を格納する動的配列 CString param; int curPos; // パラメータの分解 cmdParam.Trim(); do{ if( cmdParam.GetLength() >= curPos && cmdParam.GetAt( curPos ) == '\"' ){ // "で括われた引数 ++curPos; param = cmdParam.Tokenize( _T("\""), curPos ); } else { // 引数を半角スペースで分解 param = cmdParam.Tokenize( _T(" "), curPos ); } cmdParams.Add( param.Trim() ); }while( param != "" ); // 最後に空の文字列が追加されてしまうので取り除く cmdParams.Remove( cmdParams.GetCount() );
処理の切り分け
引数が与えられていなければcmdParamsは空のはずなのでこれを使ってやればいい。
if( cmdParams.GetSize() > 0 ){ // フォームを生成しない場合 // 引数の値のエラートラップ、処理ルーチンの呼び出し }else{ // フォームを生成するコード }