実行ファイルのフルパスを取得する

Visual C++プログラミングのメモ

【Visual C++ 2008】【MFC】

 プログラム中から、自分自身の実行ファイルのフルパスを取得するには、以下の方法が定番である。 記述場所は、どこでもよい。


    wchar_t szBuff[_MAX_PATH];
    GetModuleFileName(NULL, szBuff, _MAX_PATH);

 ところで、実行ファイルのフルパスくらい、わざわざ取得しなくてもCWinAppクラスなりCWinAppExクラスで持っていて欲しい。 そう思って、MSDNライブラリを探ったり、ステップ実行して確認したところ、 CWinAppクラスのm_pszHelpFilePathメンバ変数にヘルプファイルのフルパスが格納されていた。 言うまでもなく、実行ファイルの拡張子をヘルプファイルの拡張子(*.hlpまたは*.chm)に変更しただけのものである。

 そこで、どのようにしてヘルプファイルのフルパスを取得しているのかMFCのソースを探ったところ、


C:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\src\mfc\appinit.cpp

のCWinApp::SetCurrentHandlesにて、m_pszHelpFilePathに値を設定していた。 流れを追ってみると、本当にGetModuleFileName APIで取得したフルパスの拡張子を変更しただけであった。 ステップ実行してみると、2回通ることが確認できる(1回目はmfc90ud.dll、2回目は実行ファイル)。

 なので、以下の方法でも実行ファイルのフルパスを取得できる。 ただし、記述場所はアプリケーションクラス(CWinAppまたはCWinAppExの派生)のみである(m_pszHelpFilePathの参照のため)。


    wchar_t szBuff[_MAX_PATH];
    wcscpy_s(szBuff, _MAX_PATH, m_pszHelpFilePath);
    LPTSTR lpszExt = PathFindExtension(szBuff);
    wcscpy_s(lpszExt, _countof(szBuff) - (lpszExt - szBuff), L".exe");

 MFCが何をやっているのか、MSDNライブラリを読んでもスッキリ理解できない場合、ソースを読んでみましょう。 APIの呼び出し方の良い教科書です。 ソースはウソをつきません。

(メモ)

  • _countofは、配列の要素数。sizeof(配列)/sizeof(配列[0])
  • MSDNライブラリの「GetModuleFileName」「CWinApp::m_pszHelpFilePath」「PathFindExtension」「wcscpy_s」「_countof」を参照のこと