実行ファイルと同じ場所にiniファイルを作る

設定をiniファイルに保存するにはWriteProfileInt()等で保存できますが
デフォルトのまま使用するとWin95系の場合はWindowsフォルダにあるWin.iniに、
WinNT系ならばレジストリに値が保存されてしまいます。
実行ファイルと同じフォルダにiniファイルを作成し、それに値を保存するには
CWinAppのクラスメンバであるm_pszProfileNameを変更します。
変更場所はCXXXApp::InitInstance()で行うのがいいでしょう。

m_pszProfileNameには保存するiniファイルのパスを設定するわけですが
GetCurrentDirectory()でカレントディレクトリを取得しパスを設定すると
下手なランチャーから起動した時などカレントディレクトリが実行ファイルと
同じディレクトリじゃない場合があり上手く設定できない時があるので
ここではGetModuleFileName()で実行ファイルのパスを取得し
それをstrrchr()strcat()を使ってiniファイルのパスに変換します。
この時ついでにカレントディレクトリも設定してやると良いでしょう。

さて、後はm_pszProfileNameを変更すれば良いのではと思うでしょうが
その前に現在のポインタに対応するメモリを解放しなければなりません。
開放はfree()を使います。

さぁ、今度こそ代入して終わりだ!と思いきや、ただ代入するだけではダメです。
m_pszProfileNameに値を代入する場合は、ヒープ上に動的に割り当てます。
と言っても分かりづらいですね。ここは_strdup()を使います。

以上をまとめると以下の通り。


BOOL CXXXApp::InitInstance()
{
    // iniファイルを実行ファイルと同じディレクトリに作成
    char dir[MAX_PATH];
    ::GetModuleFileName(NULL, dir, MAX_PATH);  // 実行ファイルのパスを取得
    char* pdest = strrchr(dir, '\\');          // 実行ファイルのパスから
    pdest[1] = '\0';                           // 実行ファイル名だけ切り取る
    ::SetCurrentDirectory(dir);                // ついでのカレントディレクトリ変更
    strcat(dir, _T("XXX.ini"));                // iniファイル名を付け足す。
    free((void*)m_pszProfileName);             // メモリの解放
    m_pszProfileName = _tcsdup(dir);           // iniファイルのパスを設定
       
       :
       :
}

あとはWriteProfileInt()WriteProfileString()で値を保存できます。
読み込みはGetProfileInt()GetProfileString()ですね。

< 戻る << HOME ©1999-2001 by Akky, All right reserved.