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には解放処理はありませんでした…怖ろしや(苦笑)