S-JIS[2006-09-14] 変更履歴

iniファイルをexeと同じパスで使用する方法(VC++6.0)

MFCのアプリケーションのデータは、CWinApp::WriteProfile系の関数でiniファイルやレジストリに書き込み、CWinApp::GetProfile系の関数で取り出すことが出来ます。

昔はiniファイル、ある時期からはレジストリに書き込むのが推奨されているようですが、個人的にはiniファイルの方が中を簡単にいじれるので好みです。
しかも、アプリケーションの実行ファイルと同じディレクトリに置いておけば、探すのも簡単です(iniファイルはデフォルトではウィンドウズのディレクトリ (C:\WINDOWS)に置かれてしまいます)。
ついでに言えば、iniファイルが実行ファイルと同じディレクトリにあれば、アプリケーションを削除したい場合はそのディレクトリだけ消せばいいので、簡単です。

という訳で、iniファイルを実行ファイルと同じディレクトリに置く方法を示します。(VC++6.0用)


test.cpp:

//引数:ファイル名(m_pszProfileName)
static void InitIniName(LPCTSTR &pszProfileName)
{
	//exeファイルのフルパスを取得
	TCHAR path[_MAX_PATH];
	::GetModuleFileName(NULL,path,sizeof path);

	//exeファイルのパスを分解
	TCHAR drive[_MAX_DRIVE];
	TCHAR dir[_MAX_DIR];
	TCHAR fname[_MAX_FNAME];
	TCHAR ext[_MAX_EXT];
	_splitpath(path,drive,dir,fname,ext);

	//引数のファイル名をexeファイルのパスでフルパス化
	_makepath(path,drive,dir,pszProfileName,"");

	free((void*)pszProfileName);	//以前の領域を解放
	pszProfileName = _tcsdup(path);	//新しいファイル名を指定
}

BOOL CTestApp::InitInstance()
{
	//既存のiniファイルを、exeファイルのパスにする
	InitIniName(m_pszProfileName);
〜
}

なお、エラーチェック等は思いっきり省略しています。


デフォルトのiniファイルのファイル名は、CWinAppのm_pszProfileNameというメンバー変数で保持されています。 ここにフルパスでファイル名を指定してやることで 任意のiniファイルを作ることが出来る、ということです。

原理はVC++4.0でのやり方と同じですが、上記のやり方の方がヘッダーファイルに手を入れなくて良い分、やりやすいでしょう。

なお、VC++6.0のMFCでは、m_pszProfileNameがCWinAppのデストラクタでfree()を使って解放されます。
したがって、変更後の新しいm_pszProfileNameの解放処理をコーディングする必要はありません。
ただし、変更前のm_pszProfileNameの値は自分で解放しましょう。

ちなみに、VC++4.0のMFCには解放処理はありませんでした…怖ろしや(苦笑)


iniファイルへ読み書きする方法


VC++ページへ戻る / 技術メモへ戻る
メールの送信先:ひしだま