MFCでコマンドライン引数を解析

MFC

アプリケーションに対して外部からの入力としてコマンドライン引数を渡したいことがよくあります。

特定の拡張子にアプリケーションを紐づければ特定の拡張子のファイルを開くことでアプリケーションに引数としてファイル名が渡されるため、一般的なアプリケーションではよく使用されています。

この記事では、MFCでコマンドライン引数を解析する方法について紹介します。

コマンドライン引数とは

コマンドライン引数はアプリケーション起動時に渡される引数のことで、コマンドプロンプトなどで以下のようにアプリケーション名のあとにスペース区切りで渡される文字列が渡されます。

>> App.exe /p param1

コマンドライン引数には「パラメータ」「オプション」の2種類があり、引数の先頭に「/」がついている場合には「オプション」として認識することができます。

上記の例では「/p」が「オプション」、「param1」が「パラメータ」として認識されます。

コマンドライン引数を解析

コマンドライン引数を解析するには、「CCommandLineInfo」クラスを派生したクラスを作成し、そのインスタンスをアプリケーションクラスの「ParseCommandLine」関数に渡します。

CCommandLineInfoExの派生クラスの作成

「CCommandLineInfo」クラスの派生クラス「CCommandLineInfoEx」クラスを作成し、「ParseParam」関数をオーバーライドします。

「ParseParam」関数に引数で渡された文字列が渡されるため、「CCommandLineInfoEx」クラスのメンバに引数を登録していきます。

メンバ変数は、渡されたすべての引数を格納する「引数一覧」、「/」なしで渡された「パラメータ一覧」、「/」ありで渡された「オプション一覧」、の3種類を登録できるようにし、アプリケーションクラスから参照できるようそれぞれにゲッター関数を作成します。

#pragma once
#include <afxwin.h>

// 拡張コマンドライン情報クラス
class CCommandLineInfoEx : public CCommandLineInfo
{
protected:
    // コマンドライン引数解析
    virtual void ParseParam(const TCHAR* pszParam, BOOL bFlag, BOOL bLast);

public:
    // 引数一覧取得
    const CArray<CString>& GetArgs();
    // パラメータ一覧取得
    const CArray<CString>& GetParams();
    // オプション一覧取得
    const CArray<CString>& GetOptions();

protected:
    // 引数一覧
    CArray<CString> m_Args;
    // パラメータ一覧
    CArray<CString> m_Params;
    // オプション一覧
    CArray<CString> m_Options;
};
#include "pch.h"  // VS2019より前のバージョンの場合はstdafx.h
#include "CommandLineInfoEx.h"

// コマンドライン引数解析
void CCommandLineInfoEx::ParseParam(const TCHAR* pszParam, BOOL bFlag, BOOL/* bLast*/)
{
    // パラメータ
    if (!bFlag) this->m_Params.Add(pszParam);
    // オプション
    else this->m_Options.Add(pszParam);
    // 引数
    this->m_Args.Add(pszParam);
}

// 引数一覧取得
const CArray<CString>& CommandLineInfoEx::GetArgs()
{
    return this->m_Args;
}

// パラメータ一覧取得
const CArray<CString>& CommandLineInfoEx::GetParams()
{
    return this->m_Params;
}

// オプション一覧取得
const CArray<CString>& CommandLineInfoEx::GetOptions()
{
    return this->m_Options;
}

アプリケーションクラスで解析結果を取得

アプリケーションクラスのメンバに作成した「CCommandLineInfoEx」クラスのインスタンスを追加します。

#pragma once
#include <afxwin.h>
#include "CommandLineInfoEx.h"

class CHogeApp : CWinApp
{
    // ~~~~
protected:
    // コマンドライン引数解析
    CCommandLineInfoEx m_CmdInfo;
};

アプリケーションクラスのInitInstance関数で「ParseCommandLine」関数に追加した「m_CmdInfo」を渡します。

BOOL CHogeApp::InitInstance()
{
    // ~~~~

    // コマンドライン引数解析
    this->ParseCommandLine(this->m_CmdInfo);

    // ~~~~
}

「ParseCommandLine」関数終了後にはコマンドライン引数の解析が完了しているため、パラメータの一覧やオプションの一覧を取得することができるようになります。

終わりに

MFCでコマンドライン引数を解析する方法について紹介しました。

画面からの入力だけでなくコマンドライン引数を使用することでバッチ処理による一括操作などにも対応できるようになるため、アプリケーションにコマンドライン引数を対応しておくことは重要でしょう。

この記事について誤っている点・不明な点などありましたらコメントまでお願いします。

コメント

タイトルとURLをコピーしました