INIファイルの作成について

解決


あだち  2011-02-25 03:04:30  No: 72365

お世話になります。

VS2005 MFCにてダイアログベースの
アプリを作成しています。

フォルダ名称をINIファイルに覚えさせておきたいのですが
サンプルを参考にしたのですがINIファイルの作成ができません。
何方かお教え頂けないでしょうか。

サンプルコード抜粋
InitInstance()内で以下のコードを定義しています。
//SetRegistryKey(_T("アプリケーション ウィザードで生成されたローカル アプリケーション"));
// iniファイル設定(EXEがあるフォルダの、EXEファイル名の拡張子がiniなものになるように)
if( m_pszProfileName ){
free((void*)m_pszProfileName);
}
TCHAR  szModulePathName[MAX_PATH];
::GetModuleFileName( AfxGetInstanceHandle(), szModulePathName, MAX_PATH );  // DLLでも使えるようにAfxGetInstanceHandle()を使っている。
TCHAR  szIniPathName[_MAX_PATH];
TCHAR  drive[_MAX_DRIVE];
TCHAR  dir[_MAX_DIR];
TCHAR  fname[_MAX_FNAME];
TCHAR  ext[_MAX_EXT];
_tsplitpath_s( szModulePathName, drive, _MAX_DRIVE, dir, _MAX_DIR, fname, _MAX_FNAME, ext, _MAX_EXT );
::SetCurrentDirectory(dir);          // カレントディレクトリ変更
_tmakepath_s( szIniPathName, _MAX_PATH, drive, dir, fname, _T("ini") );
m_pszProfileName = _tcsdup( szIniPathName );
if( !m_pszProfileName ){
AfxMessageBox( _T("メモリ不足エラー") );
return FALSE;
}

OnInitDialog()で以下のコードを呼んでいます。

void CImageViewToolDlg::UpdateSettings(const BOOL bSave)
{
CWinApp* pApp = AfxGetApp();
ASSERT( pApp );
TCHAR  szSection[256];
wsprintf( szSection, _T("Settings") );
// CString型の変数
if( bSave ){
pApp->WriteProfileString( szSection, _T("InputFolderPath"), m_strInputFolder );
}
else{
m_strInputFolder = pApp->GetProfileString( szSection, _T("InputFolderPath"), m_strInputFolder );
}


  2011-02-25 05:33:12  No: 72366

WriteProfileString
Win.ini ファイルの指定されたセクションに、文字列を書き込みます。

WritePrivateProfileString
こっちじゃないですか?


瀬戸っぷ  2011-02-25 06:34:57  No: 72367

既に指摘されている通り、Write「Private」Profile〜/Get「Private」Profile〜
かと。

あと…
>_tsplitpath_s( szModulePathName, drive, _MAX_DRIVE, dir, _MAX_DIR, fname, _MAX_FNAME, ext, _MAX_EXT );
>::SetCurrentDirectory(dir); // カレントディレクトリ変更
のカレントディレクトリ移動は失敗するかも知れません。
# コールした時点ではdirにドライブ名が入っていません。
ついでに言うと、アプリのデータファイルなどはGetModuleFileName()で取得したパス名から、絶対パスでアクセスするようにした方が良いでしょう。
相対パス記述だといつカレントパスが変更されるか判りませんし。
# GetOpenFileName()とかコールしたら変わってしまった…とか。


瀬戸っぷ  2011-02-25 06:35:27  No: 72368

既に指摘されている通り、Write「Private」Profile〜/Get「Private」Profile〜
かと。

あと…
>_tsplitpath_s( szModulePathName, drive, _MAX_DRIVE, dir, _MAX_DIR, fname, _MAX_FNAME, ext, _MAX_EXT );
>::SetCurrentDirectory(dir); // カレントディレクトリ変更
のカレントディレクトリ移動は失敗するかも知れません。
# コールした時点ではdirにドライブ名が入っていません。
ついでに言うと、アプリのデータファイルなどはGetModuleFileName()で取得したパス名から、絶対パスでアクセスするようにした方が良いでしょう。
相対パス記述だといつカレントパスが変更されるか判りませんし。
# GetOpenFileName()とかコールしたら変わってしまった…とか。


瀬戸っぷ  2011-02-25 06:38:09  No: 72369

サーバエラーでリトライしたら二重投稿に(TT


あだち  2011-02-25 07:30:06  No: 72370

お世話になります。

WritePrivateProfileStringを使用することで解決致しました。

有難う御座いました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加