home > programming > notes >

実行ファイルのあるディレクトリを取得

データファイルなどへのパスは実行ファイルの位置から相対的に求めることが多いので、実行ファイルのあるディレクトリを取得します。具体的には、実行ファイルのパスをAPIのGetModuleFileName()で取得し、そこからファイル名の部分を削ります。

#include <windows.h>
#include <tchar.h>

TCHAR path[MAX_PATH];   //パス取得用
if (::GetModuleFileName(NULL, path, MAX_PATH))    //実行ファイルのフルパスを取得
{   //取得に成功
    TCHAR* ptmp = _tcsrchr(path, _T('\\')); // \の最後の出現位置を取得
    if (ptmp != NULL)
    {   //ファイル名を削除
        ptmp = _tcsinc(ptmp);   //一文字進める
        *ptmp = _T('\0');
    }
    else
    {
        //エラー:\が無い
    }
}
else
{
   //エラー:取得に失敗
}

検索したところ、_tcsrchrには0x5c問題があるというのがあったのですが、手持ちのWindows2000や98SEで試してみても確認できなかったのでこのまま行きます。

これをクラス化します。

#include <windows.h>
#include <tchar.h>

class Path
{
public:
    Path();
    ~Path() {}

    const TCHAR* GetPath() const
    { return m_Path; }

protected:
    TCHAR m_Path[MAX_PATH];
};


Path::Path()
{
    if (::GetModuleFileName(NULL, m_Path, MAX_PATH))    //実行ファイルのフルパスを取得
    {   //取得に成功
        TCHAR* ptmp = _tcsrchr(m_Path, _T('\\')); // \の最後の出現位置を取得
        if (ptmp != NULL)
        {   //ファイル名を削除
            ptmp = _tcsinc(ptmp);   //一文字進める
            *ptmp = _T('\0');
        }
        else
        {
            //エラー:\が無い
        }
    }
    else
    {
       //エラー:取得に失敗
    }
}

シングルトンパターンを使ってstatic関数Path::GetPath()で呼べるようにします。

#include <windows.h>
#include <tchar.h>

class Path
{
public:
    static const TCHAR* GetPath()
    {
        static Path path;
        return path.m_Path;
    }

private:
    Path();

protected:
    TCHAR m_Path[MAX_PATH];
};

Path::Path()
{
      ・
      ・
    (略)
}