S-JIS[2002-12-23/2006-09-14]

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

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

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

という訳で、iniファイルを実行ファイルと同じディレクトリに置く方法を示します。(ここではVC++4.0用。VC++6.0はこちら [2006-09-14]


まず、アプリケーションの実行ファイルのフルパスを取得し、指定したファイルを実行ファイルと同じディレクトリになるようなフルパスを返す関数を作成しておきます。

test.h:
class CTestApp : public CWinApp
{
〜
	CString GetModulePathFileName(LPCTSTR pName);
〜
}
test.cpp:
//引数:ファイル名
//戻り値:当アプリケーションのexeファイルと同じディレクトリになるフルパス
CString CTestApp::GetModulePathFileName(LPCTSTR pName)
{
	//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,pName,"");

	CString str(path);
	return str;
}

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


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

test.h
class CTestApp : public CWinApp
{
public:
	CTestApp();
	~CTestApp();
private:
	TCHAR* m_pProfileName;
};
test.cpp
CTestApp::CTestApp()
{
	// TODO: この位置に構築用のコードを追加してください。
	// ここに InitInstance 中の重要な初期化処理をすべて記述してください。
	m_pProfileName=NULL;
}

CTestApp::~CTestApp()
{
	delete[] m_pProfileName;	//MFCの中では解放していないので、自分で解放する必要がある[2006-09-14]
}
〜
BOOL CTestApp::InitInstance()
{
	//既存のiniファイルを、exeファイルのパスにする
	CString str=GetModulePathFileName(m_pszProfileName);

	//CStringからTCHAR*に変換する	
	m_pProfileName=new TCHAR[str.GetLength()+1];
	strcpy(m_pProfileName,str);
	m_pszProfileName=m_pProfileName;
〜
}
  1. iniファイルのパス名を保持する変数m_pszProfileNameを準備します。
  2. m_pszProfileNameをコンストラクタで初期化し、デストラクタで削除します。 デストラクタが無い場合は、自分で追加してやります。
  3. InitInstanceで、既存のiniファイルのファイル名を、実行ファイルのパスに変換します。

これで、iniファイルの位置が実行ファイルと同じディレクトリになります。


おまけとして、iniファイルから読み込む例を書いておきます。

MainFrm.cpp:
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
	CWinApp *pApp=AfxGetApp();
	cs.cx=pApp->GetProfileInt("FRAME","CX",640);
	cs.cy=pApp->GetProfileInt("FRAME","CY",480);

	return CFrameWnd::PreCreateWindow(cs);
}

AfxGetAppを使うことで、アプリケーション内のどの場所からでも iniファイルを読み書きすることが出来ます。

ちなみに、この場合のiniファイルの中は以下のような構造になっています。

test.ini:
[FRAME]
CX=512
CY=384

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