[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
となる。

コマンドライン引数取得の改良 2007/11/07

パラメータを半角スペースで区切る。ただし、"(ダブルクォーテーション)で括われていた場合、その中は半角スペースを含むことができるようにする。

// コマンドライン引数の取得
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{
 // フォームを生成するコード
}

参考にしたサイト

コマンドプロンプトで、~.exe *** の *** を判定するには?