【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」を参照のこと