アプリケーションの実行ファイルがあるディレクトリを返す関数

種別
MFC

概要
この関数は、アプリケーションの実行ファイルがあるディレクトリのパスを返します。
たとえば、アプリケーションが"c:\program files\isobe\sugoi app\main.exe" だったとすると、そのフォルダのパス"c:\program files\isobe\sugoi app\"を返します。

このフォルダパスを使用して、アプリケーションフォルダにあるファイルを読んだり書いたりするのに使用します。
プラグインなんかを検索するのに便利ですね。

※NTFSでは、管理者権限が無いと"Program Files"フォルダ以下のファイルに書き込みが出来ないのが普通です。ここにアプリケーションの設定ファイル(*.ini ファイルなど)を置くと、管理者権限が無いユーザがアプリケーションを使用した場合に予期せぬ事態になりますので、ご注意を!

解説
この関数では、内部に static な CString オブジェクト(strAppPath)を持っています。これは、関数を呼ぶたびにパスを何度も再作成するコストを抑えるためです。最初の呼び出しで、パスを作成したら、プログラムが終了するまで strAppPath の中身を変えないで、2回目の呼び出しからは、すでに作成済みのパスを返します。

戻り値は、CString の参照(CString&)になっているので、データの受け渡しのコストは最小限です。

戻り値は、const 宣言されているので、呼び出し側で戻り値の参照先の static な strAppPath を変更することは出来ません。


エラーが発生すると、空の CString の参照が返されます。
エラーをチェックする場合は、戻り値が空かどうか確認します。
が、ほとんどエラーが発生することはありません。


--ソース コード-----------------------------------------------

// Return the application's directory
// like... "c:\\AppPath\\"

const CString& GetAppPath()
{
static CString strAppPath;
if(strAppPath.IsEmpty())
{
// アプリケーションパスを取得
if(GetModuleFileName(NULL
, strAppPath.GetBuffer(_MAX_PATH)
, _MAX_PATH))
{
strAppPath.ReleaseBuffer();
char szDrive[_MAX_PATH]; // D:
char szDir[_MAX_PATH]; // \\folders\\
char szFName[_MAX_PATH]; // filename
char szExt[_MAX_PATH]; // .ext
// フルパスを分解
_tsplitpath(strAppPath, szDrive, szDir
, szFName, szExt);
// パスを作成
strAppPath.Format(_T("%s%s"), szDrive
, szDir);
}
else
// エラーの場合は、しょうがないので空のCStringを返す
{
strAppPath.ReleaseBuffer();
strAppPath.Empty();
}
}
return strAppPath;
}

==============================================
[PR]
by isoq | 2004-02-06 05:18 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇
<< 今日の一標語? ここでは、、、 >>